MySQL Innodb 隔離級別

環(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,'張三'); 卡住,等待前一個事務
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容