以下內容都是看的咕泡學院的大神老師講的乙個公開課,就是記錄一下。
1、髒讀
如下圖,左右兩個事務a、b。事務a首先查詢id=1
的資料,得到age=16
之後,事務b對id=1
的資料,將age=16
更新為age=18
,然後事務a,再查詢id=1
的資料,這種在乙個事務裡邊,多次讀取同一條資料,該資料又是在其他事務中未提交的資料,同樣的記錄,但是得到的結果前後不一致,稱為髒讀
。但是因為是沒有提交的資料,將來的某個時間有可能事務b會回滾操作,導致age
又重新變成16
。
2、不可重複讀
與髒讀
的差別在於不可重複讀
是事務b中已經提交了資料。
不可重複讀
針對的是更新和刪除,即update
、delete
。因為修改和刪除,是操作的當前資料,並且已提交無法回滾,變化已經定型,已持久化到磁碟,所以叫不可重複讀
。
如下圖,還是左右兩個事務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
操作相當於insert
和delete
兩個操作。
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 ...