在 sql 標準中定義了四種標準的隔離級別,每一種級別都規定了乙個事務中所做的修改,哪些在事務內和事務間是可見的,哪些是不可見的。較低階別的隔離通常可以執行更高的併發,系統的開銷也更低。
read uncommitted (未提交讀)
在 read uncommitted 級別中,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取已修改的未提交的資料,所以這也被稱為「髒讀」(因為事務可能回滾,導致結果並不是讀取的資料)
事務a事務b
start transaction
start transaction
select * from tran_test where id = 1;(count=1)
update tran_test set count=count-1 where id =1;
select *from tran_test where id=1;(count=0)
select * from tran_test;(count=0)
roll back
commit;
read committed (提交讀)
大多數資料庫系統的預設隔離級別是 read committed(但 mysql 不是)。定義:乙個事務開始時,只能「看見」已經提交的事務所做的修改。提交讀可以解決「髒讀」問題。但會產生「不可重複讀」,因為在乙個事務中,兩次執行相同的查詢,可能會得到不一樣的結果
事務a事務b
start transaction;
start transaction;
select * from tran_test where id=1;(count=1)
update tran_test set count=count-1 where id=1;
select * from tran_test;(count=0)
select * tran_test where id = 1;(count=1)
commit;
select * from tran_test where id = 1;(count=0)
commit;
repeatable read(可重複讀)
repeatable read 解決了髒讀和可重複讀的問題。該級別保證了在同乙個事務中多次讀取同樣記錄的結果是一致的。但無法解決另乙個「幻讀」問題。所謂「幻讀」,指的是當某個事務在讀取某個範圍內的記錄時,另乙個事務又在該範圍內插入一條記錄,當之前的事務再次讀取該範圍的記錄時,會產生「幻行」。innodb 和 xtradb 儲存引擎通過多版本併發控制(mvcc, multiversion concurrency control)解決了「幻讀」。
mysql 預設就是 「可重複讀」級別。
事務a事務b
start transaction;
start transaction;
select * from tran_test where id=1;(count=1)
update tran_test set count=count-1 where id=1;
select * from tran_test where id =1; (count=0)
select * from tran_test where id=1;(count=1)
commit;
select * from tran_test where id =1;(count=1)
commit;
serializable (可序列化)
serializable 是最高的隔離級別。它通過強制事務序列執行,避免了前面說的「幻讀」。簡單來說,serializable 會再讀取的每一行資料上都加鎖,所以可能導致大量的超時和鎖爭用。
快照讀、當前讀
快照讀:在事務中,執行普通 select 查詢之後,會建立快照,後面再執行相同的 select 語句時,查詢的其實是前面生成的快照。這就是為什麼會有可重複讀。
當前讀:每次 select 查詢,都需要從資料庫中獲取當前最新的資料。所有會產生 「不可重複讀」問題。
總結:
隔離級別
髒讀可能性
不可重複讀可能性
幻讀可能性
加鎖讀read uncommitted
yesyes
yes no
read committed no
yesyes no
repeatable read no
noyes no
serializable no
no no
yes
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
MySQL事務隔離級別
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...
Mysql 事務隔離級別
mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...