環(huán)境準備
官方文檔: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
現(xiàn)象:
在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
現(xiàn)象:
在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
現(xiàn)象:
在RR隔離級別的同一事務中,多次select 的結(jié)果集是一致的。
- session 1、session 2先后開啟事務
- session 1 首先執(zhí)行了查詢,創(chuàng)建一致性快照(時間T)
- session 2 寫入一條數(shù)據(jù)并提交
- session 1 再次查詢,由于session 2數(shù)據(jù)寫入時間在創(chuàng)建一致性快照后,因此session 1無法查詢到數(shù)據(jù)的變更。
| session 1 | session 2 | |
|---|---|---|
| begin; | ||
| begin; | ||
| select * from t;(空) | ||
| insert into t values(1,'張三');commit; | ||
| select * from t;(空) |
SERIALIZABLE
現(xiàn)象:
在串行隔離級別中,事務只能串行執(zhí)行,后一個事務需要等待前一個事務完成后才能執(zhí)行寫操作。
| session 1 | session 2 |
|---|---|
| set transaction_isolation = 'SERIALIZABLE'; | set transaction_isolation = 'SERIALIZABLE'; |
| begin; | |
| begin; | |
| select * from t;(空) | |
| insert into t values(1,'張三'); 卡住,等待前一個事務 |