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 事務的用途 事務主要處理大量...