sql server 事务

事务的ACID属性

原子性(atomicity):原子性意味着不可分割,一个事务里的操作要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作。

一致性(consistency):一个事务在执行之前和执行之后,系统会从一个正确的状态迁移到另一个正确的状态,执行前和执行后数据库的状态都满足预定的约束。

隔离性(isolation):指在并发环境中,并发的事务是相互隔离的,并发执行的各个事务之间不能相互干扰。

持久性(durability):一旦事务提交,那么它对数据库中的对应数据的变更就会永久保存到数据库中。即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。

事务并发导致的问题

丢失更新:一个事务覆盖了另一个事务的更新操作

如:事务A读取某航班的机票余额为16,这时事务B也读取了这个航班的机票余额为16,事务A修改了机票余额为15(卖出1票)但并未提交,同时事务B也修改了机票余额为14(卖出2票)并提交修改,在事务B提交后事务A也提交修改,这时事务A会覆盖事务B提交的修改,导致最终数据库记录为A的15,明明卖出了3张票,但是数据库里面显示是只卖出了1票。

 

脏读:一个事务读取了另一个事务未提交的数据

 

不可重复读:一个事务多次读取同一行且每次读取的数据值不一致。

如:事务A第一次读取到的值为1,这时事务B修改了该值为2并提交了修改,这时事务A再次读取的时候发现与第一次读取的值不一样。

 

幻读:一个事务第一次读取到的记录数和第二次读取到的记录数不一致(多了或者少了)。

事务隔离级别

未提交读(read uncommitted):一个事务正在进行写操作,则其他事务不能同时对该资源再进行写操作,只允许对该资源进行读操作;只防止了丢失更新,还是会发生脏读

 

提交读(READ COMMITTED):sql server默认的隔离级别,一个事务在进行写操作,禁止其他事务的读写操作;防止了脏读,还是存在不可重复读问题(读事务没有限制)

 

可重复读(REPEATABLE READ):读取数据的事务禁止其他写事务(允许其他读事务),写事务则禁止其他事务对该资源的任何操作(独占了该资源);防止了不可重复读问题,但是还是有幻读现象(没有范围锁)

 

快照(SNAPSHOT):事务只能识别该事务开始前提交的数据修改

 

序列化(SERIALIZABLE):事务只能一个接着一个执行,不允许并发执行。

posted @ 2020-12-05 16:46  温故纳新  阅读(137)  评论(0编辑  收藏  举报