1. 程式人生 > >MySql事務等級和幻讀

MySql事務等級和幻讀

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事務等級和幻讀