MySQL的事务隔离等级
MySQL的事务隔离等级
知识点助记
- 读未提交(RU):就像在喧闹的开放式讨论区。你可以看到别人正在纸上涂改,甚至还没定稿的笔记,草稿。效率高,但容易读到错误信息
- 读已提交(RC):在普通的阅览区,你只能看见别人正式上架的(提交)的书籍。但是在你这次阅读和下次阅读之间,书架上的书可能被人换走了
- 可重复读(RR):像在一个私人阅览室,你进去的时候,管理员会为你需要的所有书拍一张快照。在你离开前,你每次看到的内容都是这个快照里的内容,
其他读者无法换走你正在看的书。但是可能有新书入库,你的快照里没有。 - 串行化(SI):图书馆一次只能允许一位读者进入,绝对安静。
读未提交
事务可以读取其他事务尚未提交的数据修改
性能最高,基本上无锁开销,但正确率最低。
会造成:脏读。你可能读到另一个事务中途修改,随后又回滚的无效数据(脏数据)
读已提交
一个事务只能读取到其他事务已经提交的数据修改,避免了脏读。
但会造成不可重复读。同一个事务内,两次执行相同的查询,可能会得到不一样的结果(因为其他食物在这中间提交了修改)。
可重复读
保证在同一事务中,多次读取同一范围的数据时,看到的结果是一致的。是MySQL的默认级别
避免了脏读和不可重复读,但会造成幻读。在一个事务执行期间,由于其他并发事务插入/删除了新纪录,导致当前事务在后续查询中看到了之前没有看到的“幻影”行。
比方说:你在私人阅览室(事务)中统计“计算机”分类的书有10本。此时有读者新买了一本《喜羊羊与灰太狼》放入“动画”书架上(并提交),
但你基于快照的统计结果还是10本。然而,如果你尝试去借阅(更新)这本新书,就可能发现它突然“出现”了。
串行化
最严格的隔离等级,解决所有并发问题。但是性能急剧下降。
详细解读幻读与不可重复读的区别
想象你是一个班主任(事务),手里有一份花名册(数据库表)
- 不可重复读:你第一次查看花名册,看到学生 小明 的成绩是 85分。
过了一会儿(在同一个事务中,事务还没结束),你再次查看小明的成绩,发现变成了 90分!(因为另一个事务修改了小明的成绩并提交了)。
同一行数据,同一个字段,值变了
本质上是针对某一行数据的值被修改了(UPDATE)
- 幻读:你第一次查看花名册,统计“男生”人数,结果是 20人。
过了一会儿(在同一个事务中,事务还没结束),你再次统计“男生”人数,结果变成了 21人!
你翻看花名册,发现多了一个叫 小强 的新学生(因为另一个事务插入了一条新的男生记录并提交了)。
满足相同条件(WHERE)的记录 数量变了,多出来(或少一条)你之前没见过的“幻影”记录
本质上是针对满足某一查询条件的记录的集合发生了变化(INSERT/DELETE)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 花海!
