【通俗易懂】彻底搞清Mysql事务的四种隔离级别

前言

上网找资料学习,过多的专业术语让人看得头大难以专注持久阅读,本人想总结一篇博客让自己永远记住这些概念,废话不多说,通俗易懂图文并茂来彻底理解四种事务隔离级别

摆名词

读未提交(read-uncommitted)

不可重复读(read-committed)

可重复读(repeatable-read)

串行化(serializable)

脏读

不可重复读

幻读

看不懂?没关系,反正第一次看名词解释也没几个能理解的,我就连基本解释也省了直接看下面。

以经典的银行取钱为代入

剧本一.READ-UNCOMMITTED 字面意思 允许读取(另一个事务)未提交的数据

SQL :

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;

扫描二维码关注公众号,回复: 5671128 查看本文章

看图,剧本是这样的

时间线T1:事务2——>查询余额是 1000 元,买了900元东西

时间线T2:事务1——>在用户2扣款,但还未提交,用户1查询余额只有100

用户1本来想买200元的东西,查询余额只有100只好作罢 

剧本结局:事务2在事务1查询之后意外回滚了,金额变回了1000元,这次事故导致用户1本来可以买(或有机会可以买)到东西的,结果变成了余额不足

此乃事故1——脏读:隔离级别不够时,在事务过程中,读到另一事务中修改但未提交的数据

——————————————————————隔离线————————————————————

时间原因,故事不好找(很难找到不可重复读带来影响的例子),快速翻译几个名词,借助上面的故事各位自行理解下

不可重复读(read-committed):这个隔离级别应该翻译为 :可以读到自身事务内非自身事务内已经修改提交的数据 

例子:

时间1. 事务1读取到1000元

时间2:事务2扣了100元未提交

时间3:事务1读取到1000元

时间4:事务2提交,事务1读取到900元

所以叫可读已提交的数据。为什么叫不可重复读,大概是这个隔离级别有可能导致两次读取数据不一致

可重复读(repeatable-read):可以读到自身事务内已经修改提交的数据 

例子:

时间1:事务1读取到1000元

时间2:事务2扣了100元提交了

时间3:事务1读取到1000元

时间4:事务2提交,事务1读取到1000元

串行化(serializable):事务与事务之间排队执行,比如都对表1操作的两个事务,事务1和事务2,事务1执行时直接锁表,事务1执行完后,才会执行事务2——效率最低非常少使用

快速总结

隔离级别从小到大:

读未提交(read-uncommitted)——>不可重复读(read-committed)——>可重复读(repeatable-read)

——>串行化(serializable)

造成的毛病易解决程度:

脏读——>不可重复读——>幻读

读未提交(read-uncommitted)造成的毛病:脏读——>不可重复读——>幻读

不可重复读(read-committed)造成的毛病:不可重复读——>幻读     解决的毛病:脏读

可重复读(repeatable-read)造成的毛病:(mysql中) 无   解决的毛病:所有

  串行化(serializable):造成的毛病:无    解决的毛病:所有

最后:隔离级别越大事务中数据的一致性越好,但会更加影响性能

猜你喜欢

转载自blog.csdn.net/u012309392/article/details/84677031