乙個資料庫可能擁有多個訪問客戶端,這些客戶端併發訪問資料庫時,若沒有採取必要的隔離措施,存在以下問題,這些問題分為5類,包括3類資料讀問題:髒讀、不可重複讀和幻讀。兩類資料更新問題:第一類丟失更新、第二類丟失更新。
1.髒讀
a事務讀取b事務尚未提交的更改資料,並在這個資料的基礎上進行操作,這時候如果事務b回滾,那麼a事務讀到的資料是不被承認的。例如常見的取款事務和轉賬事務:
2.不可重複讀
不可重複讀是指a事務讀取了b事務已經提交的更改資料。假如a在取款事務的過程中,b往該賬戶轉賬100,a兩次讀取的餘額發生不一致。
3.幻讀
a事務讀取b事務提交的新增資料,會引發幻讀問題。幻讀一般發生在計算統計資料的事務中,例如銀行系統在同乙個事務中兩次統計存款賬戶的總金額,在兩次統計中,剛好新增了乙個存款賬戶,存入了100,這時候兩次統計的總金額不一致。
注意:不可重複讀和幻讀的區別是:前者是指讀到了已經提交的事務的更改資料(修改或刪除),後者是指讀到了其他已經提交事務的新增資料。對於這兩種問題解決採用不同的辦法,防止讀到更改資料,只需對操作的資料新增行級鎖,防止操作中的資料發生變化;二防止讀到新增資料,往往需要新增表級鎖,將整張表鎖定,防止新增資料(oracle採用多版本資料的方式實現)。
4.第一類丟失更新
a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。例如:
這時候取款事務a撤銷事務,餘額恢復為1000,這就丟失了更新。
5.第二類丟失更新
a事務覆蓋b事務已經提交的資料,造成b事務所做的操作丟失
為了解決上述問題,資料庫通過鎖機制解決併發訪問的問題。根據鎖定物件不同:分為行級鎖和表級鎖;根據併發事務鎖定的關係上看:分為共享鎖定和獨佔鎖定,共享鎖定會防止獨佔鎖定但允許其他的共享鎖定。而獨佔鎖定既防止共享鎖定也防止其他獨佔鎖定。為了更改資料,資料庫必須在進行更改的行上施加行獨佔鎖定,insert、update、delete和selsct for update語句都會隱式採用必要的行鎖定。
但是直接使用鎖機制管理是很複雜的,基於鎖機制,資料庫給使用者提供了不同的事務隔離級別,只要設定了事務隔離級別,資料庫就會分析事務中的sql語句然後自動選擇合適的鎖。
不同的隔離級別對併發問題的解決情況如圖:
事務隔離級別
1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...
事務隔離級別
四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...
事務隔離級別
需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...