MySql事務等級和幻讀
阿新 • • 發佈:2019-03-26
insert 錯誤 並發 png 沒有 zab ext UNC 讀取
四個事物等級
read uncommitted :有可能臟讀
一個事務過程中讀取到了,另一個事務的中途數據
read committed :有可能不可重復讀
即在一次事務之間,進行了兩次讀取,但是結果不一樣,可能第一次id為1的人叫“李三”,第二次讀id為1的人就叫了“李四”。因為讀取操作不會阻止其他事務
repetable read :有可能幻讀
幻讀側重的方面是某一次的 select 操作得到的結果所表征的數據狀態無法支撐後續的業務操作。更為具體一些:select 某記錄是否存在,不存在,準備插入此記錄,但執行 insert 時發現此記錄已存在,無法插入,此時就發生了幻讀
serializable :效率最低
可避免幻讀。讀加共享鎖,寫加排他鎖。這樣讀取事務可以並發,但是讀寫,寫寫事務之間都是互斥的,基本上就是一個個執行事務,所以叫序列化
查看當前事務等級
SELECT @@global.tx_isolation, @@tx_isolation;
觸發幻讀
- 事前準備
create table t1 (
id int(10),
age int(3),
primary key(id)
)
- 觸發過程
事務1 | 事務2 | 步驟 |
---|---|---|
begin | 1 | |
select * from t1 where id =1 | 2 | |
insert into t1 values (1,12) | 3 | |
insert into t1 values(1,12) | 4 |
? 在事務1中,先查詢有沒有id = 1的記錄,如果沒有就插入,但是在查詢後,事務2先插入了,那麽事務1就出現錯誤
解決幻讀
事務1 | 事務2 | 步驟 |
---|---|---|
begin | 1 | |
select * from t1 where id =1 for update | 2 | |
insert into t1 values (1,12) | 3 | |
insert into t1 values(1,12) | 4 | |
commit | 5 |
在Step2執行後,數據庫會加一個X鎖(排它鎖)。這時Step3執行後,會一直等待事務1執行完畢,當事務1 commit後,事務2就報錯了
MySql事務等級和幻讀