二十六、数据库事务的隔离级别及带来的问题

一般来讲,数据库包括以下四种隔离级别:

  1. 读未提交(Read Uncommitted)
  2. 读提交(Read Committed)
  3. 可重复读(Repeated Read)
  4. 串行化(Serializable)
各种隔离级别的定义

1、Read Uncommitted:最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。
注: 如无特殊情况,基本是不会使用这种隔离级别的。
2、Read Committed:大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。
3、Repeated Read:mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。
4、Serializable:最高隔离级别。所有事务操作依次顺序执行。
注意: 注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它;再者,一般来讲,隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

各种隔离级别带来的问题

各种隔离级别带来的问题如图所示:
在这里插入图片描述
解析:
1、快照读:既能保证一致性又不加锁的读也被称为“快照读”(Snapshot Read)。
2、Read Committed使用“快照读”机制避免了“脏读”
3、Repeated Read使用“快照读”机制,并且锁住被读记录避免了“脏读”和“不可重复读”。
附: 想要详细了解解析部分,可以查询数据库的快照机制。

脏读、不可重复读、幻读概念

1、脏读:脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
2、不可重复读:就是A事务读取数据,B事务改了这个数据,也提交成功了,A再读取就是B修改后的数据,再也不能重复读到最开始的那个数据值了,此为不可重复读。
防止不可重复读的方案:

  1. 推迟事务B的执行,直至事务A提交或者回退。这种策略在使用锁时应用。
  2. 在多版本并行控制中,事务B可以被先提交。而事务A继续执行在旧版本的数据上。当事务A终于尝试提交时,数据库会检验它的结果是否和事务A、事务B顺序执行时一样。如果是,则事务A提交成功。如果不是,事务A会被回退.

3、幻读:可重复读就是A事务读取数据,B事务改了这个数据(update),也提交成功了,A再读这个数据,SQL机制强行让A仍然读之前读到的数据值,这就是可重复读,这种机制对Insert(或者delete)操作无效,A事务在可重复读的机制下,读取数据,B事务insert一条数据,提交成功,A再读这个数据,会显示B插入的数据,此为幻读。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值