事务管理

五类并发问题

1.脏读

时间事务A事务B
T1 开始事务
T2开始事务 
T3 查询账户余额为1000元
T4 取出500元,把余额改为500元
T5查询账户余额为500元(脏读) 
T6 撤销事务,余额恢复为1000元
T7汇入100元,把余额改为600元 
T8提交事务 

A读取了B尚未提交的数据。

2.不可重复读

时间事务A事务B
T1 开始事务
T2开始事务 
T3 查询账户余额为1000元
T4查询账户余额为1000元 
T5 取出100元,把余额改为900元
T6 提交事务
T7查询账户余额为900元(和T4读取的不一致) 

AT4和T7两个时间点读取的账户余额不一致

3.幻象读


时间事务A事务B
T1 开始事务
T2开始事务 
T3  
T4统计总存款为10000元 
T5 新增一个账户,存入100元
T6 提交事务
T7再次统计总存款为10100元(幻象读) 

不可重复读是读取了修改的数据,幻象读是读取了新增的数据。为避免这种情况,第一类需要添加行级锁,第二类需要添加表级锁。

4.第一类丢失更新


时间事务A事务B
T1开始事务 
T2 开始事务
T3查询账户余额为1000元 
T4 查询账户余额为1000元
T5 汇入100元,把余额改为1100元
T6 提交事务
T7取出100元,把余额改为900元 
T8撤销事务 
T8余额恢复为1000元(丢失更新) 

A事务在撤销时,将B事务已转入账户的金额给抹去了。

5.第二类丢失更新

时间事务A事务B
T1 开始事务
T2开始事务 
T3 查询账户余额为1000元
T4查询账户余额为1000元 
T5 取出100元,把余额改为900元
T6 提交事务
T7汇入100元 
T8提交事务 
T8余额恢复为1100元(丢失更新) 

事务A覆盖了事务B的更新,导致事务B更新丢失。


事务隔离级别

隔离级别脏读不可重复读幻象读第一类丢失更新第二类丢失更新
READ UNCOMMITTED×
READ COMMITTED××
REPEATABLE READ×× ××
SERIALIZABLE×××××

READ UNCOMMITTED(未提交读) 幻想读、不可重复读和脏读都允许。一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是不正确的,所以多数的数据库都不会运用这种隔离级别。

READ COMMITTED(已提交读) 允许幻想读、不可重复读,不允许脏读。一个会话只能读取其他事务已提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。

REPEATABLE READ(可重复读) 允许幻想读,不允许不可重复读和脏读。在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改动。SQL Server是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。

SERIALIZABLE(可序列化度) 幻想读、不可重复读和脏读都不允许。在一个事务中,读取操作的结果是在这个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这种隔离级别。在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束,这样就保证了在一个事务中的两次读取操作的结果肯定是相同的。SQL标准所定义的默认事务隔离级别是SERIALIZABLE。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值