MySQL的事务隔离等级

知识点助记

  • 读未提交(RU):就像在喧闹的开放式讨论区。你可以看到别人正在纸上涂改,甚至还没定稿的笔记,草稿。效率高,但容易读到错误信息
  • 读已提交(RC):在普通的阅览区,你只能看见别人正式上架的(提交)的书籍。但是在你这次阅读和下次阅读之间,书架上的书可能被人换走了
  • 可重复读(RR):像在一个私人阅览室,你进去的时候,管理员会为你需要的所有书拍一张快照。在你离开前,你每次看到的内容都是这个快照里的内容,
    其他读者无法换走你正在看的书。但是可能有新书入库,你的快照里没有。
  • 串行化(SI):图书馆一次只能允许一位读者进入,绝对安静。

读未提交

事务可以读取其他事务尚未提交的数据修改
性能最高,基本上无锁开销,但正确率最低。
会造成:脏读。你可能读到另一个事务中途修改,随后又回滚的无效数据(脏数据)

读已提交

一个事务只能读取到其他事务已经提交的数据修改,避免了脏读。
但会造成不可重复读。同一个事务内,两次执行相同的查询,可能会得到不一样的结果(因为其他食物在这中间提交了修改)。

可重复读

保证在同一事务中,多次读取同一范围的数据时,看到的结果是一致的。是MySQL的默认级别
避免了脏读和不可重复读,但会造成幻读。在一个事务执行期间,由于其他并发事务插入/删除了新纪录,导致当前事务在后续查询中看到了之前没有看到的“幻影”行。

比方说:你在私人阅览室(事务)中统计“计算机”分类的书有10本。此时有读者新买了一本《喜羊羊与灰太狼》放入“动画”书架上(并提交),
但你基于快照的统计结果还是10本。然而,如果你尝试去借阅(更新)这本新书,就可能发现它突然“出现”了。

串行化

最严格的隔离等级,解决所有并发问题。但是性能急剧下降。

详细解读幻读与不可重复读的区别

想象你是一个班主任(事务),手里有一份花名册(数据库表)

  1. 不可重复读:你第一次查看花名册,看到学生 小明 的成绩是 85分

过了一会儿(在同一个事务中,事务还没结束),你再次查看小明的成绩,发现变成了 90分!(因为另一个事务修改了小明的成绩并提交了)。

同一行数据,同一个字段,值变了

本质上是针对某一行数据的值被修改了(UPDATE)

  1. 幻读:你第一次查看花名册,统计“男生”人数,结果是 20人

过了一会儿(在同一个事务中,事务还没结束),你再次统计“男生”人数,结果变成了 21人

你翻看花名册,发现多了一个叫 小强 的新学生(因为另一个事务插入了一条新的男生记录并提交了)。

满足相同条件(WHERE)的记录 数量变了,多出来(或少一条)你之前没见过的“幻影”记录

本质上是针对满足某一查询条件的记录的集合发生了变化(INSERT/DELETE)