MySQL 併發事務問題以及事務的隔離級別

2023-01-25 04:56:30 字數 1631 閱讀 9239

一、併發事務處理帶來的問題

相對於序列處理,併發事務(innodb)處理能大大增加資料庫資源的利用率,提高資料庫系統的事務吞吐量,從而可以支援更多使用者。

但併發事務處理也會帶來一些問題,主要有一下幾種情況:

更新丟失(lost update)

兩個或者多個事務同時選擇同一行資料,都基於最初選定的值更新該行,由於每個事務都不知道其它事務的存在,就會發生更新丟失的問題——最後提交的更新覆蓋了之前其它事務所做的更新。

髒讀(dirty reads)

一個事務正在對一條記錄進行修改,這個事務完成並提交前,這條記錄的資料就處於不一致的狀態。此時,另一個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些“髒”資料,並依據此做了進一步的處理,就會產生對未提交的資料的依賴關係。這種現象就叫做“髒讀”。

不可重複讀(non-repetable reads)

一個事務在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現讀出的資料已經發生了改變、或者某些記錄已經被刪除了!這種現象叫“不可重複讀”。

幻讀(phantom reads)

一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其它事務插入了滿足其查詢條件的新資料。這種現象叫“幻讀”。

二、事務的隔離級別

上述提到的併發事務處理帶來的問題,“更新丟失”是應該完全避免的。

防止更新丟失,不能單單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決,因此,防止更新丟失應該是應用的責任。

髒讀、不可重複讀和幻讀,其實都是資料庫讀一致性問題,必須由資料庫提供一定的事務隔離機制來解決。資料庫實現事務隔離的方式,有以下兩種:

1、在讀取資料前,對其加鎖,阻止其它事務對資料進行修改。

2、另一種是不用加任何鎖,通過一定的機制生成一個資料請求時間點的一致性資料快照,並用這個快照來提供一定級別(語句級別或者事務級別)的一致性讀取。從使用者的角度看,就好像資料庫可以提供同一資料的多個版本,因此這種技術叫做資料多版本併發控制(mvcc)或多版本資料庫。

資料庫的事務隔離越嚴格,併發***越小,但是付出的代價越大。因為事務隔離實質上是讓事務在一定程度上“序列化”進行,這顯然與併發是矛盾的。同時,不同的應用對讀一致性和事務隔離程度的要求也是不同的,比如許多應用對“不可重複讀”和“幻讀”並不敏感,可能更關心資料併發訪問能力。

為了解決事務“隔離”與“併發”的矛盾,iso/ansi sql92定義了4個事務隔離級別,每個級別的隔離程度不同,允許出現的***也不同,應用可以根據自己的業務邏輯要求,通過選擇不同的隔離級別來平衡隔離與併發的矛盾。

4種隔離級別如下圖:

資料庫未必就一定實現了上述4個隔離級別,orcale、sql server等各有不同。mysql支援全部的四個隔離級別,但在具體實現時,有一些特點,比如在一些隔離級別下采用mvcc一致性讀,但是某些情況下又不是。

三、對於innodb表的鎖問題的小結

小結:在瞭解了innodb鎖特性後,使用者可以通過設計和sql調整等措施減少鎖衝突和死鎖,包括:

Mysql事務 事務併發及 事務隔離

1 事務概念 事務是包含了一組有序的資料庫操作命令的序列,它是資料庫併發操作的最小控制單位。2 事務特性 3 事務操作命令 1 serializable 序列化 一個事務在執行過程中完全看不到其他事務對資料庫所做的更新 事務執行的時候不允許別的事務併發執行。事務序列化執行,事務只能一個接著一個地執行...

事務併發的問題

轉 2018年07月02日 18 52 56 dingguanyi 一個資料庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫。資料庫中的相同資料可能同時被多個事務訪問,如果沒有采取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。這些問題可以歸結為5類,包括3類資料讀問題 髒讀 不...

事務併發問題以及處理方法

事務併發問題 1.第一類丟失更新 lost update 在完全未隔離事務的情況下,兩個事物更新同一條資料資源,某一事物異常終止,回滾造成第一個完成的更新也同時丟失。2.髒讀 dirty read 如果第二個事務查詢到第一個事務還未提交的更新資料,形成髒讀。3.虛讀 phantom read 一個事...