事務隔離級別

2021-09-26 06:59:49 字數 1561 閱讀 1458

1.問題

同乙個應用程式中的多個事務或不同應用程式中的多個事務在同乙個資料集上併發執行時, 可能會出現許多意外的問題,這些問題可分為如下三種型別:

①髒讀(drity read): 已知有兩個事務a和b, a讀取了已經被b更新但還沒有被提交的資料,之後,b回滾事務,a讀取的資料就是髒資料。

②不可重複讀(non-repeatable read):已知有兩個事務a和b,a 多次讀取同一資料,b 在a多次讀取的過程中對資料作了修改並提交,導致a多次讀取同一資料時,結果不一致,例子:

③幻讀(phantom read): 已知有兩個事務a和b,a從乙個表中讀取了資料,然後b在該表中插入了一些新資料,導致a再次讀取同乙個表, 就會多出幾行,簡單地說,乙個事務中先後讀取乙個範圍的記錄,但每次讀取的紀錄數不同,稱之為幻象讀,例子:

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

2.解決方案

根據實際需求,通過設定資料庫的事務隔離級別可以解決多個事務併發情況下出現的髒讀、不可重複讀和幻讀問題,資料庫事務隔離級別由低到高依次為read uncommitted、read committed、repeatable read和serializable等四種。資料庫不同,其支援的事務隔離級別亦不相同:mysql資料庫支援上面四種事務隔離級別,預設為repeatable read;oracle 資料庫支援read committed和serializable兩種事務隔離級別,預設為read committed。

①read uncommitted(讀未提交):可能出現髒讀、不可重複讀和幻讀。

②read committed(讀提交):可以避免髒讀,但可能出現不可重複讀和幻讀。大多數資料庫預設級別就是read committed,比如sql server資料庫和oracle資料庫。注意:該隔離級別在寫資料時只會鎖住相應的行。

③repeatable read(重複讀):可以避免髒讀和不可重複讀,但可能出現幻讀。注意:(1)事務隔離級別為可重複讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是next-key 鎖;(2)如果檢索條件沒有索引,更新資料時會鎖住整張表。乙個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。

④serializable(序列化):可以避免髒讀、不可重複讀和幻讀,但是併發性極低,一般很少使用。注意:該隔離級別在讀寫資料時會鎖住整張表。

總結:

說明:√表示可能出現,×表示不會出現

注意:隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。所以第乙個和最後乙個都不可取。

事務隔離級別

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 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...