環(huán)境準(zhǔn)備
官方文檔:https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
測(cè)試版本:MySQL 5.7.25
測(cè)試表:
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隔離級(jí)別中砚著,其他事務(wù)操作的未提交
的事務(wù)修改,能被當(dāng)前事務(wù)讀取到薯嗤。
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隔離級(jí)別中买窟,其他事務(wù)操作的已提交
的事務(wù)修改登渣,能被當(dāng)前事務(wù)讀取到摊求。
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隔離級(jí)別的同一事務(wù)中,多次select 的結(jié)果集是一致的索守。
- session 1晕窑、session 2先后開啟事務(wù)
- session 1 首先執(zhí)行了查詢,創(chuàng)建一致性快照(時(shí)間T)
- session 2 寫入一條數(shù)據(jù)并提交
- session 1 再次查詢卵佛,由于session 2數(shù)據(jù)寫入時(shí)間在創(chuàng)建一致性快照后杨赤,因此session 1無(wú)法查詢到數(shù)據(jù)的變更。
session 1 | session 2 | |
---|---|---|
begin; | ||
begin; | ||
select * from t;(空) | ||
insert into t values(1,'張三');commit; | ||
select * from t;(空) |
SERIALIZABLE
現(xiàn)象:
在串行隔離級(jí)別中截汪,事務(wù)只能串行執(zhí)行疾牲,后一個(gè)事務(wù)需要等待前一個(gè)事務(wù)完成后才能執(zhí)行寫操作。
session 1 | session 2 |
---|---|
set transaction_isolation = 'SERIALIZABLE'; | set transaction_isolation = 'SERIALIZABLE'; |
begin; | |
begin; | |
select * from t;(空) | |
insert into t values(1,'張三'); 卡住衙解,等待前一個(gè)事務(wù) |