MySQL InnoDB事務模型

2021-07-28 04:20:04 字數 2794 閱讀 2549

事務的acid特性:原子性、一致性、隔離性、永續性。這部分不多說了,任何一本講資料庫理論的書籍裡邊都會有講。mysql innodb通過鎖來實現事務的一致性和隔離性,共實現了四種事務隔離級別:

·read uncommitted讀取未提交

某個session中的事務可以看到其他session的事務中尚未提交的更改,而該更改可能回滾,即會出現」髒讀「

1:這種隔離級別幾乎不被使用,在selelct將會看到各種奇怪的資料現象,當然包括其它事務還未提交的資料。
·read committed讀取提交

某個session中的事務只可以看到其他session的事務中已經提交的更改,不會出現」髒讀「,但乙個事務對同一物件的兩次查詢結果可能出現不一致,即會出現「不可重複讀」;

1:每乙個select都會使用各自的資料狀態的快照。

2:如果當前的資料狀態已更新到最新,但是噹噹個select的時候仍然會產生不一致的資料狀態。

3:更少的間隙鎖意味著更少的死鎖。

4:唯一key的檢查在第二索引和其它外來鍵檢查的時候也會產生間隙所。(gap必須被鎖定以防止在parent row被刪除後仍在child row中插入相關資料)。

5:這種隔離級別也是使用的非常普遍的隔離級別尤其是在5.1以後的版本中。

6:徵對在5.0更早的版本中,可以通過innodb_locks_unsafe_for_binlog移除gap locking。

(in v5.1, most gap-locking is removed w/ this level, but you must use row-based logging/replication。)

·repeatable read可重讀

某個session中的事務不能查詢到其他session的事務中未提交和已經提交的更改,不會出現」不可重複讀」,但期間,其他事務卻可能對資料進行更改並提交,而這些更改對前乙個事務中的insert/update/delete等語句是可見的,因此可能出現」更新丟失「,另外,雖然select不到,但對其進行更改操作時卻真實的存在,就好像幻象一樣,且更改過後可以被同一事物中的select看到,也即」幻像讀「(其實」不可重複讀」也可理解為」幻像讀「,因為同一事務中前後兩次讀取到的結果不一樣,看個人怎麼理解了,這些叫法只是乙個名字而已);

1:所有的select在第一次一致讀以後在事務中都會使用一樣的資料狀態快照。

2:update,delete都會使用間隙鎖來保證資料的安全。防止phantom。

3:這是採用最廣的事務隔離級別,也是mysql預設的事務隔離級別。

·serializable可序列化

使事務序列化執行,解決上述問題。

1:這種隔離級別對資料的要求最為嚴格,自然也是效能最差的一種隔離級別。在所有的select語句中都是預設加了乙個lock

in share mode的鎖,

2:在這種隔離級別中沒有一致讀的,所有的select都將返回最近的資料狀態。

3:由於這種隔離級別的對資料高度一致的嚴格,所以會產生很多的鎖,自然也會導致很多的死鎖,對效能的影響不言而喻。

若 mysql 變數autocommit 設定為 1,也即開啟了自動提交特性,則事務隱式的開啟/關閉,每條sql自成乙個事務,執行後事務自動提交 。此時,也可通過 start transaction/begin 顯式的開啟事務,而通過commit/rollback顯式結束事務;若變數autocommit 設定為 0,也即關閉了自動提交特性,則連線的session會始終保持開啟乙個事物,可通過commit/rollback 顯式的結束事務並開啟新的事務。鎖在事務內的每條sql語句中逐個獲取而在事務結束後被全部釋放。

檢視全域性和session的事務隔離級別

select @@global.tx_isolation, @@session.tx_isolation;
設定全域性和session級別的事物隔離級別。

需注意的是若指定了 global 關鍵字則會對所有後續的 session 生效而對當前session無效。若指定了session關鍵字則會對當前 session 中的後續的事務生效而對當前事務無效。若沒有指定任何關鍵字則僅對當前session中接下來的乙個事務生效。

set

global/session

transaction

isolation

level serializable;

set globa/sessionl tx_isolation='repeatable-read';

create

table t1 (i int, primary

key (i)) engine = innodb;

開啟兩個session,session a和sessionb。innodb預設事務隔離級別為 repeatable read。我們先從最低的隔離級別開始read uncommitted測試。

Mysql InnoDB 事務簡單理解

1.事務基本特性 acid a 由undo 來實現的 i 由鎖實現 d 由redo實現 c 由aid共同保證 2.undo 實現了 事務的回滾 以及 mvcc 事務的回滾 記錄下事務期間的所有update delete insert操作的前後value,當需要rollback時會做乙個相反的操作。m...

Mysql InnoDB事務隔離級別

隔離級別 髒讀 dirty read 不可重複讀 nonrepeatable read 幻讀 phantom read 未提交讀 read uncommitted 可能可能 可能已提交讀 read committed 不可能可能 可能可重複讀 repeatable read 不可能不可能 可能可序列...

MySQL Innodb事務ACID原理

資料庫事務的四大特性有原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 根據定義,原子性是指乙個事務是乙個不可分割的工作單位,其中的操作要麼都做,要麼都不做。即要麼轉賬成功,要麼轉賬失敗,是不存在中間的狀態!根據定義,隔離性是指多個...