diff --git "a/31\345\220\264\346\254\243\347\207\225/\344\275\234\344\270\232/2022-10-06.md" "b/31\345\220\264\346\254\243\347\207\225/\344\275\234\344\270\232/2022-10-06.md" new file mode 100644 index 0000000000000000000000000000000000000000..3a90ce9d753397a1438094041c06322bc0a06e1f --- /dev/null +++ "b/31\345\220\264\346\254\243\347\207\225/\344\275\234\344\270\232/2022-10-06.md" @@ -0,0 +1,35 @@ +``` +select * from AccountInfo --个人信息 +select * from BankCard --银行卡信息 +select * from CardStateChange --银行卡状态更改表 +select * from CardTransfer --转账表 +select * from CardExchange --交易记录 +--假设刘备取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +--update BankCard set CardMoney=6000 where CardNo=6225125478544587; + +alter table bankcard +add check(cardmoney>=0); + +begin transaction t_bank +update BankCard set CardMoney=CardMoney-6000 where CardNo=6225125478544587 +if @@ERROR!=0 +rollback transaction +insert into CardExchange values(6225125478544587,0,6000,GETDATE()) +if @@ERROR!=0 +rollback transaction +else +commit transaction t_bank +--刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +begin transaction t_banktransfer +update BankCard set CardMoney=CardMoney-1000 where CardNo=6225125478544587 +if @@ERROR!=0 +rollback transaction +insert into CardTransfer values(6225125478544587,6225547854125656,1000,GETDATE()) +if @@ERROR!=0 +rollback transaction +update BankCard set CardMoney=CardMoney+1000 where CardNo=6225547854125656 +if @@ERROR!=0 +rollback transaction +else +commit transaction t_banktransfer +``` \ No newline at end of file diff --git "a/31\345\220\264\346\254\243\347\207\225/\347\254\224\350\256\260/\344\272\213\345\212\241.md" "b/31\345\220\264\346\254\243\347\207\225/\347\254\224\350\256\260/\344\272\213\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..67a26bb90cd28671cfe698ddeb6a183eee6eb14a --- /dev/null +++ "b/31\345\220\264\346\254\243\347\207\225/\347\254\224\350\256\260/\344\272\213\345\212\241.md" @@ -0,0 +1,59 @@ +### 事务 + +**事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。** + +**事务中的所有 SQL 语句是一个整体,共同进退,不可分割,要么全部执行成功,要么全部执行失败。** + +#### 事务的属性(ACID) + +##### 1) 原子性 **A**tomicity + +一个事务中的所有 SQL 语句,要么全部执行成功,要么全部执行失败,不会结束在中间的某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态 + +##### 2) 一致性 **C**onsistency + +在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 + +##### 3) 隔离性 **I**solation + +数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 + +##### 4) 持久性 **D**urability + +事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + +### + +``` +--开始事务 +begin tran +--错误代码 +declare @err int = 0 + +--事务提交:如果语句都执行成功, commit tran/transaction +if (@myerr = 0) + begin + commit transaction A + end +--事务回滚:如果事务中有一条语句执行失败, rollback tran/transaction +else + begin + rollback transaction B + end + + --select * from Products +--print @@error --错误码:0:执行成功 非0的时候代表该语句有错误 + +--标记事务回滚起点 : save tran B + +--方法2: +----begin try +---- --事务的开始:begin tran +---- --sql语句 +---- commit --提交 +----end try + +----begin catch --捕获错误,如果某条语句执行错误,将被捕获 +---- rollback tran +----end +``` \ No newline at end of file