1. 程式人生 > >演示資料庫不同隔離級別下的事務併發問題

演示資料庫不同隔離級別下的事務併發問題

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

1.當把事務的隔離級別設定為read uncommitted時,會引發髒讀、不可重複讀和虛讀


A視窗
set transaction isolation level  read uncommitted;
start transaction;
select * from account;
-----發現a帳戶是1000元,轉到b視窗
select * from account
-----發現a多了100元,這時候a讀到了b未提交的資料(髒讀)


B視窗
start transaction;
update account set money=money+100 where name='aaa';
-----不要提交,轉到a視窗查詢


2.當把事務的隔離級別設定為read committed時,會引發不可重複讀和虛讀,但避免了髒讀

A視窗
set transaction isolation level  read committed;
start transaction;
select * from account;
-----發現a帳戶是1000元,轉到b視窗
select * from account;
-----發現a帳戶多了100,這時候,a讀到了別的事務提交的資料,兩次讀取a帳戶讀到的是不同的結果(不可重複讀)


B視窗
start transaction;
update account set money=money+100 where name='aaa';
commit;
-----轉到a視窗


3.當把事務的隔離級別設定為repeatable read(mysql預設級別)時,會引發虛讀,但避免了髒讀、不可重複讀

A視窗
set transaction isolation level repeatable read;
start transaction;
select * from account;
----發現表有4個記錄,轉到b視窗
select * from account;
----可能發現表有5條記如,這時候發生了a讀取到另外一個事務插入的資料(虛讀)


B視窗
start transaction;
insert into account(name,money) values('ggg',1000);
commit;
-----轉到 a視窗

4.當把事務的隔離級別設定為Serializable時,會避免所有問題
A視窗
set transaction isolation level Serializable;
start transaction;
select * from account;
-----轉到b視窗

B視窗
start transaction;
insert into account(name,money) values('ggg',1000);
-----發現不能插入,只能等待a結束事務才能插入