diff --git "a/04\351\203\221\347\216\256\345\226\206/\344\275\234\344\270\232/2022.09.28-\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.txt" "b/04\351\203\221\347\216\256\345\226\206/\344\275\234\344\270\232/2022.09.28-\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.txt" new file mode 100644 index 0000000000000000000000000000000000000000..6b0b31a958b4780e010a0f83ad0e2f4700143d4f --- /dev/null +++ "b/04\351\203\221\347\216\256\345\226\206/\344\275\234\344\270\232/2022.09.28-\347\254\254\345\205\253\346\254\241\344\275\234\344\270\232.txt" @@ -0,0 +1,62 @@ +--1.--假设刘备取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +alter table BankCard add constraint CK_Money check(CardMoney >= 0) + +declare @myError int = 0 +declare @getMoney float = 6000 +declare @carID varchar(10) +declare @name varchar(10) +declare @Phone varchar(10) +set @name = '刘备' + +select @carID = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @Phone = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) + +begin transaction A +update BankCard set CardMoney -= @getMoney where CardNo = @carID +set @myError += @@ERROR +insert into CardExchange values(@carID,0,@getMoney,getdate()) +set @myError += @@ERROR + +if(@myError = 0) +begin + commit transaction A +end +else +begin + rollback transaction B +end +go + +--2.--刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +alter table BankCard add constraint CK_Money check(CardMoney >= 0) +declare @myError int = 0 +declare @getMoney float = 1000 +declare @carID varchar(10) +declare @carID1 varchar(10) +declare @name varchar(10) +declare @name1 varchar(10) +declare @Phone varchar(10) +declare @Phone1 varchar(10) +set @name = '刘备' +set @name1 = '张飞' +select @carID = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @Phone = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name) +select @carID1 = (select b.CardNo from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name1) +select @Phone1 = (select a.AccountPhone from AccountInfo a inner join BankCard b on a.AccountId =b.AccountId where RealName = @name1) + +begin transaction +update BankCard set CardMoney -= @getMoney where CardNo = @carID +set @myError += @@ERROR +update BankCard set CardMoney += @getMoney where CardNo = @carID1 +set @myError += @@ERROR +insert into CardTransfer values(@carID,@carID1,@getMoney,getdate()) +set @myError += @@ERROR + +if(@myError = 0) +begin + commit transaction +end +else +begin + rollback transaction +end \ No newline at end of file diff --git "a/04\351\203\221\347\216\256\345\226\206/\347\254\224\350\256\260/2022.09.28-\344\272\213\345\212\241.md" "b/04\351\203\221\347\216\256\345\226\206/\347\254\224\350\256\260/2022.09.28-\344\272\213\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..b9354ad5f26a07c924f37d340b784d77aa77d1fe --- /dev/null +++ "b/04\351\203\221\347\216\256\345\226\206/\347\254\224\350\256\260/2022.09.28-\344\272\213\345\212\241.md" @@ -0,0 +1,23 @@ +8、事务 + +### Transaction + +一般来说,事务具有四个标准属性,分别是原子性(**A**tomicity,或称不可分割性)、一致性(**C**onsistency)、隔离性(**I**solation,又称独立性)、持久性(**D**urability),简称 **ACID**。 + +**自动提交事物**: 是SQL Server默认的一种事务模式,每条Sql语句都被看成一个事务进行处理。 + +**显式事务**: T-sql标明,由Begin Transaction开启事务开始,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束。 + +开始语句 + + begin transaction + +用@@errorr来判断是否回滚 + +提交语句 + + commit transaction + +回滚语句 + + rollback transaction