事務併發問題及事務隔離級別的學習

2021-10-06 04:12:26 字數 2747 閱讀 1759

以下內容都是看的咕泡學院的大神老師講的乙個公開課,就是記錄一下。

1、髒讀

如下圖,左右兩個事務a、b。事務a首先查詢id=1的資料,得到age=16之後,事務b對id=1的資料,將age=16更新為age=18,然後事務a,再查詢id=1的資料,這種在乙個事務裡邊,多次讀取同一條資料,該資料又是在其他事務中未提交的資料,同樣的記錄,但是得到的結果前後不一致,稱為髒讀。但是因為是沒有提交的資料,將來的某個時間有可能事務b會回滾操作,導致age又重新變成16

2、不可重複讀

髒讀的差別在於不可重複讀是事務b中已經提交了資料。

不可重複讀針對的是更新和刪除,即updatedelete。因為修改和刪除,是操作的當前資料,並且已提交無法回滾,變化已經定型,已持久化到磁碟,所以叫不可重複讀

如下圖,還是左右兩個事務a、b。事務a首先查詢id=1的資料,得到age=16之後,事務b對id=1的資料,將age=16更新為age=18,並且進行了commit,即提交了。然後事務a,再查詢id=1的資料,讀取的資料是age=18

3、幻讀

幻讀是針對insert語句,事務a執行乙個範圍查詢,本來只有一條資料,但是經過事務b新增了一條資料後,導致再次查詢變成了2條資料。

髒讀不可重複讀的區別在於是否提交,髒讀意思是未提交,還沒有持久化到磁碟,這種的資料有可能會回滾再變回原來的資料,而不可重複讀就在與已提交的資料,以前的資料不可能再讀回來的。

insert帶來的問題不屬於不可重複讀insert並沒有動到以前的資料,也就是說資料一致性並沒有破壞,是新增資料帶來的其他事務讀不一致問題。

事務併發帶來的三大問題,其實就是資料庫讀一致性的問題,必須由資料庫提供一定的事務隔離機制來解決。

事務隔離有如下級別,sql92 ansi/iso標準通過定義四種隔離級別,來規範資料庫廠商按照該功能提供解決不同級別的事務併發問題。

如上圖所示,一共有四種隔離級別。分別解決的如下圖所示 問題:

mysql的innodb中預設事務隔離級別是可重複讀(repeatable read),在innodb儲存引擎中,可重複讀(repeatable read)的隔離級別同時也解決了幻讀問題。innodb預設使用 rr 作為事務隔離級別的原因,既保證了資料的一致性,又支援較高的併發度。

第一種即讀取資料前對其加鎖,阻止其他事務對資料進行修改,lock based concurrency control(lbcc)。這種方案導致的問題是,如果有人讀取資料,不會允許其他事務進行修改,簡單粗暴。

第二種即生成乙個資料請求時間點的一致性資料快照(snapshot),並用這個快照提供一定級別(語句級和事務級)的一致性讀取。即保證在一定時間內多次讀取資料一致。

innodb中對於每行資料其實都隱藏了三個字段:

db_row_id:6位元組,行標識

db_trx_id:6位元組,插入或更新行的最後乙個事務id,自動遞增(建立版本號)

db_roll_ptr:7位元組,回滾指標(刪除版本號)

對於innodb中在兩個併發的事物中,每個事務只能查詢到建立版本號小於等於自己事務id的,刪除版本號大於等於自己事務id的。

insert操作時,會遞增乙個db_trx_id值,因為原則上是只能查詢到建立版本號小於等於自己事務id的,因此會在其他事務開啟後未提交之前,是查詢不到當前新增的資料。

delete操作時,當前事務id會遞增到db_roll_ptr欄位上,因為原則上是查刪除版本號大於等於自己事務id的,因此當在某個事務刪除記錄後,以前開啟但未關閉的事務,仍舊會查詢到在其他事務已經刪除的資料。

在mysql中update操作相當於insertdelete兩個操作。

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

1 原子性 atomicity 事務一旦開始,那麼我們只能有兩個結果,要麼全部執行完成,要麼全部都不做,不能停滯在事務中途。如果在執行 錯,必須把事務回滾到事務開始前。2 一致性 consistency 事務開始前和結束後,資料庫的完整性約束沒有被破壞 比如買東西,付款的時候,我扣錢成功了,對方也一...

事務併發問題和隔離級別

事務有四個屬性,acid。事務併發會造成三個問題 髒讀,不可重複讀,幻讀。髒讀 事務a讀了事務b更新的資料,然後事務b回滾撤銷了,事務a讀取的資料就是髒讀。不可重複讀 事務a讀取資料num後,事務b對其修改,事務a再次讀取資料num,前後不一致,這情況為不可重複讀。幻讀 事務a讀取資料 一張表 事務...

MySQL事務隔離級別 解決併發問題

mysql事務隔離級別 1.髒讀 騙錢的手段,兩個視窗或執行緒分別呼叫資料庫轉賬表,轉賬後未提交,對方檢視到賬後,rollback,實際錢沒轉.演示方法 mysql預設的事務隔離級別為repeatable read 比oracle高,因為mysql本身弱 使用select tx isolation ...