前言
上网找资料学习,过多的专业术语让人看得头大难以专注持久阅读,本人想总结一篇博客让自己永远记住这些概念,废话不多说,通俗易懂、图文并茂来彻底理解四种事务隔离级别
摆名词
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)
脏读
不可重复读
幻读
看不懂?没关系,反正第一次看名词解释也没几个能理解的,我就连基本解释也省了直接看下面。
以经典的银行取钱为代入
剧本一.READ-UNCOMMITTED 字面意思 允许读取(另一个事务)未提交的数据
SQL :
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
看图,剧本是这样的
时间线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):造成的毛病:无 解决的毛病:所有