前言:
Mysql支持MyISAM和InnoDB两种存储引擎,区别在此就不详细说明。此篇是讲述事务,所以切记自己的table是InnDB。此处大坑!
在Mysql InnoDB 中,事务主要有四种隔离级别
- Read uncommitted (未提交读)
- Read committed (已提交读)
- Repeatable read (可重复读)
- Serializable (可串行化)
在理解四种隔离级别之前,我们需要先了解另外三个名词:
- 脏读
- 不可重复读
- 幻读
脏读
另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。
不重复读
解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。
幻读
解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。
下面我们就直接来通过实验来看,Mysql Innodb中,不同的事务隔离级别,会出现怎么样的结果。
首先我们开启两个终端,查询当前MySQL的默认隔离级别:
SELECT @@global.tx_isolation; //查询全局事务
SELECT @@session.tx_isolation; //查询当前会话事务
可以看到,默认的隔离级别是:REPEATABLE-READ
实验Read uncommitted
我们