mysql的4種事務隔離級別和8種傳播行為

2021-09-26 10:36:05 字數 1711 閱讀 4234

1、原子性(atomicity):要麼全部做完,要麼全部不做。

2、一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如a向b轉賬,不可能a扣了錢,b卻沒收到。

3、隔離性(isolation):同時只允許乙個事務請求同一資料。

4、永續性(durability):事務完成後所有更新將被儲存到資料庫,不能回滾。

1、髒讀:事務a更新某資料但未提交,此時事務b查詢該資料後,事務a才提交。事務b查詢到的資料為臟讀資料。

2、不可重複讀:事務a讀取某一資料,此時事務b更新該資料並提交,事務a再次讀取該資料時,資料不一致。

3、幻讀:事務a讀取某一資料表,此時事務b新增資料或刪除該資料表的資料並提交,事務a再次讀取該資料表時,資料不一致。

#不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的記錄,解決幻讀需要鎖表或者加範圍鎖。(幻讀是對大範圍的資料而言的併發問題,因為對某一資料的並發行為,新增和刪除資料不是併發問題,只有對它修改才是併發問題)

事務隔離級別

髒讀不可重複讀

幻讀讀未提交(read-uncommitted)是是

是讀已提交(read-committed)否是

是可重複讀(repeatable-read)否否

是序列化(serializable)否否

否是:表示該級別會發生該種併發問題

指定方式:通過使用 isolation 屬性設定,例如:

@transactional(isolation = isolation.read-committed)                   不寫裡面的引數就為預設的read-committed

悲觀鎖:假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作。

樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。(樂觀鎖不能解決髒讀的問題,因為髒讀問題的產生在於資料未提交就被另一事務查詢)

結論:在實際生產環境裡邊,如果併發量不大且不允許髒讀,可以使用悲觀鎖解決併發問題;但如果系統的併發非常大的話,悲觀鎖定會帶來非常大的效能問題,這時候只能接受髒讀,選擇樂觀鎖定的方法。

傳播行為是指,如果在開始當前事務之前,已經存在乙個事務,此時可以指定這個要開始的這個事務的執行行為。

required :(預設)如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。

supports :如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。

mandatory :如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。

requires_new :建立乙個新的事務,如果當前存在事務,則把當前事務掛起。

not_supported :以非事務方式執行,如果當前存在事務,則把當前事務掛起。

never :以非事務方式執行,如果當前存在事務,則丟擲異常。

nested :如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務, 則該取值等價於 required 。

指定方式:通過使用 propagation 屬性設定,例如:

@transactional(propagation = propagation.required)      和隔離級別一樣,不寫就預設為required

MySQL事務的4種特性以及事務隔離級別

事務的基本特性 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consisten...

mysql 4種事務隔離級別驗證

1.建表 create table test id int 11 not null auto increment,name varchar 255 default null,primary key id engine innodb auto increment 6 default charset u...

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...