資料庫事務級別

2022-07-13 18:36:11 字數 2052 閱讀 1225

併發導致資料出現的問題

1.髒讀(drity read)

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

注:即事務b讀取了事務a在記憶體中修改的資料(未提交寫入資料庫的磁碟)

即read_uncommitted(讀未提交隔離機制)即可發生的問題

場景:公司發工資了,領導把5000元打到tom的賬號上,但是該事務並未提交,而tom正好去檢視賬戶,發現工資已經到賬,賬戶多了5000元,非常高興,可是不幸的是,領導發現發給tom的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,tom再次檢視賬戶時發現賬戶只多了2000元。

2. 不可重複讀(non-repeatable read)

釋義:已知有兩個事務a和b,a 多次讀取同一資料,b 在a多次讀取的過程中對資料作了修改並提交,導致a多次讀取同一資料時,結果不一致。

注:即事務b在前後讀取乙個資料的期間,事務a對該資料進行了修改。

read_commited隔離機制即可發生該問題

場景:tom拿著工資卡去消費,酒足飯飽後在收銀台買單,服務員告訴他本次消費1000元,tom將銀行卡給服務員,服務員將銀行卡插入pos機,pos機讀到卡里餘額為3000元,就在tom磨磨蹭蹭輸入密碼時,他老婆以迅雷不及掩耳盜鈴之勢把tom工資卡的3000元轉到自己賬戶並提交了事務,當tom輸完密碼並點選「確認」按鈕後,pos機檢查到tom的工資卡已經沒有錢,扣款失敗。

3.幻讀(phantom read)

釋義:已知有兩個事務a和b,a從乙個表中讀取了資料,然後b在該表中插入了一些新資料,導致a再次讀取同乙個表, 就會多出幾行,簡單地說,乙個事務中

注:事務b前後讀取的資料庫期間,事務a對該資料庫進行了增加操作

場景:om的老婆工作在銀行部門,她時常通過銀行內部系統檢視tom的工資卡消費記錄。2023年5月的某一天,她查詢到tom當月工資卡的總消費額(select sum(amount) from record where card_id=『6226090219290000』 and date_format(create_time,』%y-%m』)=『2019-05』)為80元,tom的老婆非常吃驚,心想「老公真是太節儉了,嫁給他真好!」,而tom此時正好在外面胡吃海塞後在收銀台買單,消費1000元,即新增了一條1000元的消費記錄並提交了事務,沉浸在幸福中的老婆查詢了tom當月工資卡消費明細(select amount from record where card_id=『6226090219290000』 and date_format(create_time,』%y-%m』)=『2019-05』)一**竟,可查出的結果竟然發現有一筆1000元的消費。

4.總結

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

用資料庫的事務隔離機制對資料問題進行解決

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

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

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

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

髒讀:讀取了未提交事務的資料;

幻讀:第一次讀取的資料再次讀取資料的時候資料變多了或者變少;

不可重複讀:第一次讀取的資料再次讀取的時候被修改;

以下是各個資料級別可能出現的問題;

讀未提交:髒讀、幻讀、不可重複讀

讀提交:幻讀、不可重複讀

重複讀:幻讀

序列化:都不會出現(該隔離級別在讀寫資料時會鎖住整張表)

資料庫事務級別

1.地球人都知道的,但往往你就不能說出口,所以事務的相關概念還是有必要提一下 事務特性 acid特性 事務隔離級別 由弱到強分別是 read uncommitted read committed repeatable read和serializable ps mysql的預設事務隔離級別是repea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務的級別

1.read uncommitted 髒讀 讀取正在提交的資料 read uncommitted 又稱讀取未提交內容 允許任務讀取資料庫中未提交的資料更改。測試指令碼 建立表 create table dbo testtb id int null,name char 20 null 2.建立 事務a...