vlambda博客
学习文章列表

【技术浅谈】浅谈MySQL隔離机制

是新朋友吗?记得先点蓝字关注我哦~

【技术浅谈】浅谈MySQL隔離机制




上期小编为大家介绍了框架安装,环境配置和tensor基础概念教学。这里是上一期文章的链接:


本期,小编将浅谈一下MySQL隔離机制。



概要


对关系型数据库有所了解的人应该都听说过事务的ACID四大原则,分别是原子性(Atomicity),一致性(Consistency),隔離性(Isolation)和持久性(Durability)。今天我就来介绍一下隔離性的作用以及MySQL的隔離机制是如何的。



并发问题


什么是数据库中的并发问题呢?简单来说就是只有一个数据库的情况下,多个用户同时对这个数据库里的同一部分数据进行了事务操作,这样的话就会出现一些数据风险。具体来讲,我们通常考虑三种常见的并发问题,分别是脏读(dirty read),不可重复读(non-repeatable read)和幻读(phantom)。接下来我将用MySQL举例说明这三种问题的情景。



MySQL表的用例


我会用对以下表的事务操作作为例子:

【技术浅谈】浅谈MySQL隔離机制



三种并发问题


脏读 Dirty read 

・事务 A 读取了事务 B 修改但未提交的数据。如果进行了回滚(rollback)的话,该数据可能并不会存在。 

・将MySQL隔離级别设置为read uncommitted(后述),则会发生脏读。

・例:

【技术浅谈】浅谈MySQL隔離机制

不可重复读 Non-Repeatable Read

・事务 A 从事务 B 的"update"查询中读取了已提交的数据,导致前后两次读到的数据不一致。例如,事务A检索同一行两次,但看到不同的数据。 

・会发生在MySQL的read uncommitted, read committed 隔離等级中。

・例:

【技术浅谈】浅谈MySQL隔離机制

幻读 Phantom

・事务 A 从事务 B 的 "INSERT "或 "DELETE "查询中读取已提交数据,导致事务 A 前后读取一个数据范围返回的结果不一致。 

・会发生在MySQL的read uncommitted, read committed, repeatable read 隔離等级中。

・但是,MySQL的InnoDB存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间的数据库中行的数据。如果当前读取的是一个"INSERT "或 "DELETE "的操作,不会等待锁的释放,会先读取InnoDB存储引擎中快照数据(snapshot)。这就导致即使是在 repeatable read 的隔離级别下,也不会直接重现幻读的现象。但如果事务 A 对同一行也进行了更新操作,就可以重现幻读了。

・例:

【技术浅谈】浅谈MySQL隔離机制



MySQL的InnoDB隔離级别


隔離是一种机制概念,意思是在一个事务进行处理的过程中,对外界隐藏,并且不会影响其他事务。InnoDB中共有四种隔離机制,分别为read uncommitted(读未提交,相当于不隔離), read committed(读已提交),repeatable read(可重复读,默认机制)和serializable(可序列化)。根据上面总结的三大问题,这四种隔离机制能覆盖的解决范围也都不同。

【技术浅谈】浅谈MySQL隔離机制

这里留给读者一个问题:既然serializable最强,为什么不只用这一种隔离机制呢?

好啦,本期就到这里结束了,我们下期再见~


▽ ▽ ▽ ▽ ▽ ▽ ▽


关注灯塔计划IT学院

掌握IT行业新动向

▽ ▽ ▽

文字:Gilfoyle

排版:悠米

【技术浅谈】浅谈MySQL隔離机制


点“在看”给我一朵小黄花