【技术浅谈】浅谈MySQL隔離机制
是新朋友吗?记得先点蓝字关注我哦~
上期小编为大家介绍了框架安装,环境配置和tensor基础概念教学。这里是上一期文章的链接:
本期,小编将浅谈一下MySQL隔離机制。
概要
对关系型数据库有所了解的人应该都听说过事务的ACID四大原则,分别是原子性(Atomicity),一致性(Consistency),隔離性(Isolation)和持久性(Durability)。今天我就来介绍一下隔離性的作用以及MySQL的隔離机制是如何的。
并发问题
什么是数据库中的并发问题呢?简单来说就是只有一个数据库的情况下,多个用户同时对这个数据库里的同一部分数据进行了事务操作,这样的话就会出现一些数据风险。具体来讲,我们通常考虑三种常见的并发问题,分别是脏读(dirty read),不可重复读(non-repeatable read)和幻读(phantom)。接下来我将用MySQL举例说明这三种问题的情景。
MySQL表的用例
我会用对以下表的事务操作作为例子:
三种并发问题
脏读 Dirty read
・事务 A 读取了事务 B 修改但未提交的数据。如果进行了回滚(rollback)的话,该数据可能并不会存在。
・将MySQL隔離级别设置为read uncommitted(后述),则会发生脏读。
・例:
不可重复读 Non-Repeatable Read
・事务 A 从事务 B 的"update"查询中读取了已提交的数据,导致前后两次读到的数据不一致。例如,事务A检索同一行两次,但看到不同的数据。
・会发生在MySQL的read uncommitted, read committed 隔離等级中。
・例:
幻读 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的InnoDB隔離级别
隔離是一种机制概念,意思是在一个事务进行处理的过程中,对外界隐藏,并且不会影响其他事务。InnoDB中共有四种隔離机制,分别为read uncommitted(读未提交,相当于不隔離), read committed(读已提交),repeatable read(可重复读,默认机制)和serializable(可序列化)。根据上面总结的三大问题,这四种隔离机制能覆盖的解决范围也都不同。
这里留给读者一个问题:既然serializable最强,为什么不只用这一种隔离机制呢?
好啦,本期就到这里结束了,我们下期再见~
▽ ▽ ▽ ▽ ▽ ▽ ▽
关注灯塔计划IT学院
掌握IT行业新动向
▽ ▽ ▽
文字:Gilfoyle
排版:悠米
点“在看”给我一朵小黄花