https://zhuanlan.zhihu.com/p/117476959/
本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的。
数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实不是没做,是可能做了一部分但是只要有一步失败,就要回滚所有操作,有点一不做二不休的意思。
脏读 、可重复读 、不可重复读、幻读
SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:
- 读未提交(READ UNCOMMITTED)
- 读提交 (READ COMMITTED)
- 可重复读 (REPEATABLE READ)
- 串行化 (SERIALIZABLE)
从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读是 MySQL 的默认级别。
事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。(这种其实就是一个事务与另一个事务之间发生的)
脏读:读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚、 也就是可能最终不会存到数据库中,也就是不存在的数据
可重复读 :
不管我当前事务如何去进行查询,查询到的都是这条数据,就算有另外一个事务过来提交并修改了同一条数据 ,在当前事务内仍然还是这一条数据。
可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作。
不可重复读:
当前事务在进行查询的时候,只能查看到针对这条数据,修改并且已经提交的数据。
当我们将当前会话的隔离级别设置为read committed的时候,当前会话只能读取到其他事务提交的数据,未提交的数据读不到。
幻读