資料庫中的併發事務,及併發事務的兩種機制

2021-10-09 03:11:55 字數 1099 閱讀 2883

為了解決資料庫併發事務時,可能會產生的資料不一致,資料庫提供了隔離級別和鎖。

1)髒讀:資料庫併發訪問的情況下,不同的事務對同一條資料操作,事務a修改資料未提交時,事務b讀取了該資料修改後的結果,但事務a回滾rollback,未提交。導致事務b讀取了事務a未提交的資料,即讀未提交。

2)不可重複讀:事務a過程中,讀取了事務b提交的修改某條資料的結果,導致在事務過程中,前後兩次讀取的結果不一致。即讀已提交。

3)幻讀:事務a前後兩次讀取,後一次讀取的資料更多了(insert),事務b在兩次讀取期間插入了資料。

為了解決資料庫中併發事務出現的資料不一致的問題,資料庫提供了隔離機制。

背景:myisam儲存引擎不支援事務和行鎖,支援表鎖。

innodb儲存引擎支援事務行鎖表鎖。

read-uncommited(讀未提交):最低的隔離級別,允許讀取未提交的資料,不能避免髒讀,不可重複讀,幻讀。

read-commited(讀已提交):允許讀取併發事務已提交的資料。

避免了髒讀,不能避免不可重複讀,幻讀。

repeatbale-read(可重複讀):併發事務中,多次讀取的結果一致。

避免了髒讀,不可重複讀,不能避免幻讀。

socializable(可序列化):事務一次執行,互不干擾。

避免了髒讀,不可重複讀,幻讀。

事務id是遞增的。

使用mvcc(多版本併發控制)。innodb為每行記錄新增了乙個事務id,每當修改資料時,將當事務id寫入。

在讀取事務開始時,系統會給事務乙個當前版本號(事務id),事務會讀取版本號<=當前版本號的資料,這時就算另乙個事務插入乙個資料,並立馬提交,新插入這條資料的版本號會比讀取事務的版本號高,因此讀取事務讀的資料還是不會變。

為了讓資料庫併發事務的隔離機制實現,資料庫提供了鎖。

資料庫有併發事務時,可能會產生資料不一致,這是需要一些機制來保證訪問次序,鎖就是這樣的機制。

不能濫用鎖:鎖的各種操作消耗資源。

隔離級別越低,鎖的請求越少。

mysql的預設隔離界別是repeatable-read(不可重複讀)。

大部分的資料庫作業系統如oracle的預設隔離界別是read-commited。

資料庫併發事務

比如有乙個方法a,在a的內部有兩次同樣的select查詢,但是在兩次select之間方法b對資料庫進行了修改,那麼查詢到的a兩次查詢到的內容是否一致呢,這其實就是資料庫的 不可重複讀 幻讀 問題 這裡用spring hibernate mysql實驗,如果方法a不在事務環境下執行,那麼查詢到的兩次結...

資料庫事務與併發

資料庫事務必須具備acid特徵 1 原子性 指整個資料事務是不可分割的工作單元。只有事務中所有操作執行成功,才算整個事務成功 事務中任何乙個sql語句執行失敗,那麼已經執行成功的sql語句也必須撤銷,資料庫狀態應該退回到執行事務前的狀態。2 一致性 指資料庫事務不能破壞關係資料的完整性以及業務邏輯上...

資料庫的事務 事務併發以及隔離級別

事務的定義 事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。事務通常是以begin transaction開始,以commi...