1. 程式人生 > >MySQL學習總結-演示不同隔離級別下的並發問題

MySQL學習總結-演示不同隔離級別下的並發問題

-- val 事務提交 賬戶 演示 zab serializa table into

演示不同隔離級別下的並發問題

1.當把事務的隔離級別設置為read uncommitted,會引發臟讀、不可重復讀和虛讀
A窗口
set transaction isolation level read uncommitted;
start transaction;
select * from bank;
----發現a賬戶是1000元,轉到b窗口
select * from bank;

B窗口
start transaction;
update bank set money=money+100 where name=‘a‘;
----不要提交,轉到a窗口查詢

2.當把事務的隔離級別設置為read committed 時,會引發不可重復讀和虛讀,但避免了臟讀
A窗口
set transaction isolation level read committed;
start transaction;
select * from bank;
----發現a賬戶是1000元,轉到b窗口
select * from bank;
----發現a賬戶多了100,這時候,a讀到了別的事務提交的數據,連續讀取a賬戶讀到的是不同的結果 (不可重復讀)

B窗口
start transaction;
update bank set money=money+100 where name=‘a‘;
commit;
----轉到a窗口查詢

3.當把事務的隔離級別設置為repeatable read (mysql默認級別) 時,會引發虛讀,但避免了臟讀和不可重復讀
A窗口
set transaction isolation level repeatable read;
start transaction;
select * from bank;
----發現表有4條記錄,轉到b窗口
select * from bank;
----可能發現表有5條記錄,這時候發生了a讀取到另外一個事務插入的數據 (虛讀)

B窗口
start transaction;
insert into bank (name,money) values (‘e‘,1000);
commit;
----轉到a窗口查詢

4.當把事務的隔離級別設置為Serializable,會避免所有問題
A窗口
set transaction isolation level Serializable;
start transaction;
select * from bank;


B窗口
start transaction;
insert into bank (name,money) values (‘e‘,1000);
----發現不能插入,只能等待a窗口結束事務才能插入

MySQL學習總結-演示不同隔離級別下的並發問題