MySQL Innodb 隔离级别
2020-11-11 本文已影响0人
醉红尘丶
环境准备
官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
测试版本:MySQL 5.7.25
测试表:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
READ UNCOMMITTED
现象:
在RU隔离级别中,其他事务操作的未提交的事务修改,能被当前事务读取到。
| session 1 | session 2 | |
|---|---|---|
| set transaction_isolation = 'READ-UNCOMMITTED'; | set transaction_isolation = 'READ-UNCOMMITTED'; | |
| begin; | ||
| begin; | ||
| select * from t;(空) | ||
| insert into t values(1,'张三'); 未提交 | ||
| select * from t;(有值) |
READ COMMITTED
现象:
在RC隔离级别中,其他事务操作的已提交的事务修改,能被当前事务读取到。
| session 1 | session 2 | |
|---|---|---|
| set transaction_isolation = 'READ-COMMITTED'; | set transaction_isolation = 'READ-COMMITTED'; | |
| begin; | ||
| begin; | ||
| select * from t;(空) | ||
| insert into t values(1,'张三');commit; | ||
| select * from t;(有值) |
REPEATABLE READ
现象:
在RR隔离级别的同一事务中,多次select 的结果集是一致的。
- session 1、session 2先后开启事务
- session 1 首先执行了查询,创建一致性快照(时间T)
- session 2 写入一条数据并提交
- session 1 再次查询,由于session 2数据写入时间在创建一致性快照后,因此session 1无法查询到数据的变更。
| session 1 | session 2 | |
|---|---|---|
| begin; | ||
| begin; | ||
| select * from t;(空) | ||
| insert into t values(1,'张三');commit; | ||
| select * from t;(空) |
SERIALIZABLE
现象:
在串行隔离级别中,事务只能串行执行,后一个事务需要等待前一个事务完成后才能执行写操作。
| session 1 | session 2 |
|---|---|
| set transaction_isolation = 'SERIALIZABLE'; | set transaction_isolation = 'SERIALIZABLE'; |
| begin; | |
| begin; | |
| select * from t;(空) | |
| insert into t values(1,'张三'); 卡住,等待前一个事务 |