演示資料庫不同隔離級別下的事務併發問題
演示不同隔離級別下的併發問題
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結束事務才能插入