mysql事務級別及幻讀情況模擬

2022-10-09 04:12:09 字數 1321 閱讀 5976

mysql是大家常用的關係型資料儲存資料庫,為了保證一組操作的原子性(同時成功/同時失敗)利用了事務。但是同一時間上讀寫可能存在的重複讀、幻讀/髒讀等問題,就涉及到事務級別(預設級別:rr 可重複讀 repeatable-read)設定。

事務級別分為:未提交可讀(read uncommitted) 提交可讀(read committed)可重複讀(repeatable read)序列化(serializable)

read uncommitted:事務未提交時即可讀取,可能導致髒讀。

read committed:事務提交後才可讀取,但不可重複讀(更新事務未提交前,其它查詢為老值,但同一事務內存在更新前後查詢不一致問題)(發生在update操作時)。

repeatable read: 可重複讀,但是可能幻讀(發生在insert操作時)。

幻讀:a事務第一次查詢時只存在一條,b事務新增一條記錄,a事務再更新操作時更新成功兩條。

幻讀具體案例:

a事務:

select * from `ims_user`;     #查詢結果1條

b事務:

insert ims_user ( name,status) values( 'c3',3);   #新插入一條

commit ;

a事務:

select * from `ims_user`;#查詢結果還是1條

update ims_user set `status` = 4 where `status`=3;  #更新結果2條。

commit ;

幻讀產生可能原因分析:

1、結果快取:我們可以先插入,後查詢則結果正常。

驗證步驟:

b事務:

insert ims_user ( name,status) values( 'c3',3);   #新插入一條

commit ;

a事務:

select * from `ims_user`;#查詢結果正常,新插入資料可查詢到

2、無鎖:「select * from `ims_user`;」查詢從快照中讀,不存在鎖。當發生「update/delete/insert」時為當前讀,會產生行鎖、表鎖或者間隙鎖(rr機制下)。

解決方案:

1、切換事務級別為serializable。

2、悲觀鎖:select * from `ims_user` for update;

serializable:序列化事務機制,序列處理任務。犧牲效能,保證資料。

其它:檢視當前事務級別:select @@tx_isolation;

檢視當前事務是否自動提交:show variables like 'autocommit';

mysql事務隔離級別及幻讀

一 事務的基本特性 acid 1.原子性 atomicity 事務中的所有操作要麼全部生效,要麼全部不生效。事務如果執行過程中報錯,會將所有的操作回滾。也就是事務中的所有操作是乙個整體,就像化學中學過的院子,是構成物質的基本單位。2.一致性 consistency 事務開始前和事務結束後,資料處於一...

mysql事務隔離級別幻讀的解釋

不可重複度和幻讀區別 不可重複讀的重點是修改,幻讀的重點在於新增或者刪除。例1 同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了 事務1中的a先生讀取自己的工資為 1000的操作還沒完成,事務2中的b先生就修改了a的工資為2000,導 致a再讀自己的工資時工資變為 2000 這就是不可重複讀。...

MySQL隔離級別(幻讀)

mysql 事務的基本了解 acid 1 事務的概念 什麼是事務呢?事務是指單個邏輯單元完成一些列操作,它要麼全部執行成功,要麼就失敗。事務處理可確保只有事務單元的操作。否則就不會擁有永久面向資料的更新資源,乙個邏輯工作單元要想成為事務,那麼他就必須要擁有事務的特性。2 事務的用途 事務主要處理大量...