diff --git "a/41\350\203\241\345\237\272\350\200\200/9.28/.keep" "b/41\350\203\241\345\237\272\350\200\200/9.28/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/41\350\203\241\345\237\272\350\200\200/9.28/9.28/SQLQuery1.sql" "b/41\350\203\241\345\237\272\350\200\200/9.28/9.28/SQLQuery1.sql" new file mode 100644 index 0000000000000000000000000000000000000000..23fa713f5db2aeab82eaa8ae412e8b5be2e66e7a --- /dev/null +++ "b/41\350\203\241\345\237\272\350\200\200/9.28/9.28/SQLQuery1.sql" @@ -0,0 +1,40 @@ +--1.假设刘备取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +begin transaction +declare @MyError int = 0 +update BankCard set CardMoney = CardMoney-6000 where CardNo = '420107198905064135' +set @MyError = @MyError + @@ERROR +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('420107198905064135',0,6000,GETDATE()) +set @MyError = @MyError + @@ERROR +if @MyError=0 +begin + commit transaction + print '取款成功' +end + else +begin + rollback transaction + print '取款失败,余额不足' +end +; +--2.刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +begin transaction +declare @Error int=0 +update BankCard set CardMoney = CardMoney-1000 where CardNo = '420107198905064135' +set @Error = @@ERROR + @Error +update BankCard set CardMoney = CardMoney+1000 where CardNo = '420107199602034138' +set @Error = @@ERROR + @Error +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) +values ('420107198905064135','420107199602034138',1000,GETDATE()) +set @Error = @@ERROR + @Error +if @Error = 0 + begin + commit + print'转账成功' + end +else + begin + rollback + print'转账失败' + end +; \ No newline at end of file diff --git "a/41\350\203\241\345\237\272\350\200\200/9.28/9.28/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/41\350\203\241\345\237\272\350\200\200/9.28/9.28/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" new file mode 100644 index 0000000000000000000000000000000000000000..df3a2b34358fd9b3d350660b0c271bf5f955da66 --- /dev/null +++ "b/41\350\203\241\345\237\272\350\200\200/9.28/9.28/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" @@ -0,0 +1,73 @@ +事务 + + + + + 什么是事务 + +事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。 + +事务中的所有 SQL 语句是一个整体,共同进退,不可分割,要么全部执行成功,要么全部执行失败。 + + + + + + + + 事务的属性(ACID) + +一般来说,事务具有四个标准属性 分别是 + 原子性(*A*tomicity,或称不可分割性 + 一致性(**C**onsistency) + 隔离性(**I**solation,又称独立性 + 持久性(**D**urability),简称 *ACID* + +具体说明如下: + 1) 原子性 + +一个事务中的所有 SQL 语句,要么全部执行成功, +要么全部执行失败,不会结束在中间的某个环节。 +事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态, +就像这个事务从来没有执行过一样。 + + 2) 一致性 + +在事务开始之前和事务结束以后,数据库的完整性没有被破坏。 +这表示写入的数据必须完全符合所有的预设规则, +其中包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 + + 3) 隔离性 + +数据库允许多个并发事务同时对其数据进行读写和修改的能力, +隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 +事务隔离分为不同级别,包括读未提交(Read uncommitted)、 +读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 + 死锁 操作系统 + + 4) 持久性 + +事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + + + + + + + + 事务分类 + + 自动提交事物: + 是SQL Server默认的一种事务模式,每条Sql语句都被看成一个事务进行处理。 + + 显式事务: +T-sql标明,由Begin Transaction开启事务开始,由Commit Transaction 提交事务、Rollback Transaction 回滚事务结束。 + + 隐式事务: +使用Set IMPLICIT_TRANSACTIONS ON 将将隐式事务模式打开,不用Begin Transaction开启事务,当一个事务结束,这个模式会自动启用下一个事务,只用Commit Transaction 提交事务、Rollback Transaction 回滚事务即可。 + +TIPS: + 事物回滚: + +xact_abort on/off : 为on时如果当前sql出错,回滚整个事务, +为off时如果sql出错回滚当前sql语句,其它语句照常运行读写数据库。 \ No newline at end of file