ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MySQL 的事务隔离级别(重点面试题)

MySQL 的事务隔离级别(重点面试题) MySQL 的事务隔离级别重点面试题⭐️⭐️⭐️SQL 标准定义了四种隔离级别MySQL 全都支持. 这四种隔离级别分别是1.读未提交(READ UNCOMMITTED)读未提交也叫未提交读. 该隔离级别的事务可以看到其他事务中未提交的数据.举个例子事务1是用来提交数据的事务2是用来查询数据的。事务1插入了一条新的数据但是事务1还没有提交commit。此时事务2查询数据库中的数据。但是事务2查询到的数据却包含了事务1未提交的数据。存在的问题脏读因为其他事务未提交的数据可能会发生回滚但是该隔离级别却可以读到我们把该级别读到的数据称之为脏数据这个问题称之为脏读.2.读已提交(READ COMMITTED)读已提交也叫提交读。该隔离级别的事务能读取到已经提交事务的数据该隔离级别不会有脏读的问题.举个例子存在的问题不可重复读但由于在事务的执行中可以读取到其他事务提交的结果所以在不同时间的相同 SQL 查询可能会得到不同的结果这种现象叫做不可重复读3.可重复读(REPEATABLE READ)事务不会读到其他事务对已有数据的修改即使其他事务已提交。即在同一个事务当中同一个 sql语句得到的结果是一样的。为什么是这样的和 MVCC机制有关。MVCC机制建议百度ai搜索MVCC机制如何实现 在同一个事务当中同一个 sql语句得到的结果是一样的MVCC 保证同一事务中同条 SQL 结果一致核心就两点事务第一次查数据时会生成一个「数据快照 可见性规则」Read View后续不管查多少次都复用这个快照和规则不看新数据即便其他事务修改数据并且完成提交当前事务看到的仍然是快照记录的旧版本数据。因此在当前事务内部同一条查询 SQL多次执行得到的查询结果始终保持一致。也就可以确保同一事务多次查询的结果一致但是其他事务新插入的数据是可以感知到的. 这也就引发了幻读问题.可重复读是 MySQL 的默认事务隔离级别。存在的问题幻读比如此级别的事务正在执行时另一个事务成功的插入了某条数据但因为它每次查询的结果都是一样的所以会导致查询不到这条数据。自己重复插入同一条数据时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息但自己就是插入不进去这个现象叫幻读.画图来理解问题分析事务2查询两次数据库表没有查询到 新的数据但是当事务2 插入 事务1 最新插入的记录insert语句就会执行失败。原因事务2的隔离级别是不可重复读 无法查看到事务1插入后的数据不知道这条记录已经存在所以事务2插入相同的记录插入失败这个问题就叫做幻读4.串行化(SERIALIZABLE)序列化事务最高隔离级别。存在的问题事务的执行效率低它会强制事务排序使之不会发生冲突从而解决了脏读不可重复读和幻读问题但因为执行效率低所以真正使用的场景并不多。一张图总结脏读读未提交存在的问题表现事务2 读到 事务1没有提交的数据。不可重复读读已提交存在的问题表现事务1执行插入数据的操作事务2两次读到的数据不一致。第一次是事务1还没提交事务2 读到了没有提交数据的记录第二次是事务1提交了数据。事务2 读到了提交了数据的记录幻读可重复读存在的问题表现事务2读取不到事务1修改后的数据插入数据事务2自己进行相同操作插入数据时会失败。结尾最后如果这篇博客能帮到你的请你点点赞有写错了写的不好的欢迎评论指出谢谢
返回列表