Mysql事務詳解

2022-03-30 19:50:11 字數 2342 閱讀 4499

不可重複讀和幻讀的區別應該在於:

不可重複讀是主要是說多次讀取一條記錄, 發現該記錄中某些列值被修改過。

幻讀是主要是說多次讀取乙個範圍內的記錄(包括直接查詢所有記錄結果或者做聚合統計), 發現結果不一致(標準檔案一般指記錄增多, 記錄的減少應該也算是幻讀)

解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖住表

修改隔離級別:

set tx_isolation='read-commited/read-uncommited/repeatable-read/serializable'
檢視隔離級別:

分為四個隔離級別:未提交讀、已提交讀、可重複讀(mysql預設)、可序列化

隔離級別

讀資料一致性

髒讀不可重複讀

幻讀未提交讀(read-uncommitted)

最低級別,只能保證不讀取物理上損壞的資料是是

是已提交讀(read-committed)

語句級否是是

可重複讀(repeatable-read)

事務級否否是

可序列化(serializable)

最高端別,事務級否否

否檢視mysql預設的事務隔離級別為repeatable-read

未提交讀

(1)開啟乙個客戶端a,並設定當前事務模式為read uncommitted(未提交讀),查詢user表的pwd欄位

(2)在客戶端a事務提交之前,開啟另乙個客戶端b,更新user表的pwd欄位

(3)這時,雖然客戶端b的事務還沒提交,但是客戶端a就可以查詢到客戶端b已經更新的資料了

(4)一旦客戶端b的事務以為某種原因回滾,所有的操作都將會被撤銷,那客戶端a查詢到的資料其實就是髒資料

已提交讀

(1)開啟乙個客戶端a,並設定當前事務模式為read committed(未提交讀),查詢表user的所有記錄:

(2)在客戶端a的事務提交之前,開啟另乙個客戶端b,更新表user:

(3)這時,客戶端b的事務還沒提交,客戶端a不能查詢到b已經更新的資料,解決了髒讀問題:

(4)客戶端b的事務提交

(5)客戶端a執行與上一步相同的查詢,結果 與上一步不一致,即產生了不可重複讀的問題

可重複讀

(1)開啟乙個客戶端a,並設定當前事務模式為repeatable read,查詢表user的所有記錄

(2)在客戶端a的事務提交之前,開啟另乙個客戶端b,更新表user並提交

(3)在客戶端a查詢表user的所有記錄,與步驟(1)查詢結果一致,沒有出現不可重複讀的問題

(4)重新開啟客戶端b,插入一條新資料後提交

(5)在客戶端a查詢表account的所有記錄,沒有 查出 新增資料,所以沒有出現幻讀(疑惑的地方)

可序列化

(1)開啟乙個客戶端a,並設定當前事務模式為serializable,查詢表user的初始值:

(2)開啟乙個客戶端b,並設定當前事務模式為serializable,插入一條記錄報錯,表被鎖了插入失敗,mysql中事務隔離級別為serializable時會鎖表,因此不會出現幻讀的情況,這種隔離級別併發性極低,開發中很少會用到。

mysql事務詳解

使用者訪問資料庫時,資料庫會為使用者開啟乙個程序,使用者可以通過這個程序對資料庫進行增 刪 改 查的操作,這個程序就稱為事務。1 原子性 指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生 例如 在乙個事務中,對t1表新增乙個資料,並對t2表刪除乙個資料,這兩步操作要麼都成功,要麼...

MySQL 事務詳解

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱 文章等等,這樣,這些眾多的資料庫操作語句就構成乙個事務!一般來說,事務必須滿足以下 4 個條件 acid 而我們在學習事務的時候最複雜也是最...

mysql事務詳解

轉至 參考 mysql隔離級別 通俗理解 mysql oracle預設事務隔離級別 簡單點總結下他們的區別 髒讀是指讀取了未修改完的記錄,不可重複讀指因為被其它事務修改了記錄導致某事務兩次讀取記錄不一致,而幻讀是指因為其它事務對錶做了增刪導致某事務兩次讀取的表記錄數不一致問題。1 read unco...