查看當(dāng)前會(huì)話隔離級(jí)別
select @@tx_isolation;
查看系統(tǒng)當(dāng)前隔離級(jí)別
select @@global.tx_isolation;
設(shè)置當(dāng)前會(huì)話隔離級(jí)別
set session transaction isolation level READ COMMITTED;
開啟事務(wù)
set autocommit=off
或start transaction
或begin
隔離級(jí)別
-
read uncommitted
(讀取未提交數(shù)據(jù))
A 事務(wù)能讀取到腥放,B事務(wù)修改的但未提交的數(shù)據(jù) (臟讀)
-
read committed
(可以讀取其他事務(wù)提交的數(shù)據(jù))
A 事務(wù)不能讀取到泛啸,B事務(wù)修改的但未提交的數(shù)據(jù)
A 事務(wù)能讀取到,A事務(wù)修改的但未提交的數(shù)據(jù)
A 事務(wù)能讀取到秃症,B事務(wù)修改的并提交的數(shù)據(jù)
//新開2個(gè)會(huì)話按如下順序執(zhí)行候址,測試:
//A 事務(wù) (會(huì)話1)
set session transaction isolation level READ COMMITTED;
begin ;
SELECT value FROM xx_table WHERE id=1; //此時(shí) value字段值為1
//B事務(wù) (會(huì)話2)
set session transaction isolation level READ COMMITTED;
begin
SELECT value FROM xx_table WHERE id=1 //此時(shí) value字段值為1
//A事務(wù)
UPDATE xx_table SET `value` = 2 WHERE id = 1;
COMMIT;
//B事務(wù)
SELECT value FROM xx_table WHERE id=1 //此時(shí) value字段值為2 (不可重復(fù)讀)
- repeatable read (可重讀)
A 事務(wù)不能讀取到种柑,B事務(wù)修改的但未提交的數(shù)據(jù)
A 事務(wù)能讀取到岗仑,A事務(wù)修改的但未提交的數(shù)據(jù)
同一條數(shù)據(jù)中
,A 事務(wù)不能讀取到聚请,B事務(wù)修改的并提交的數(shù)據(jù) (可重讀)
//新開2個(gè)會(huì)話按如下順序執(zhí)行荠雕,測試:
//A 事務(wù) (會(huì)話1)
set session transaction isolation level REPEATABLE READ;
begin ;
SELECT value FROM xx_table WHERE id=1; //此時(shí) value字段值為1
//B事務(wù) (會(huì)話2)
set session transaction isolation level READ COMMITTED;
begin
SELECT value FROM xx_table WHERE id=1 //此時(shí) value字段值為1
//A事務(wù)
UPDATE xx_table SET `value` = 2 WHERE id = 1;
COMMIT;
//B事務(wù)
SELECT value FROM xx_table WHERE id=1 //此時(shí) value字段值 還是為 1 (可重復(fù)讀),和讀提交級(jí)別的區(qū)別
- serializable 串行化
寫讀操作事務(wù)炸卑,需等待其他事務(wù)執(zhí)行完
參考資料
五分鐘搞清楚MySQL事務(wù)隔離級(jí)別
互聯(lián)網(wǎng)項(xiàng)目中mysql應(yīng)該選什么事務(wù)隔離級(jí)別 -> Read Commited