2014/7/27------資料庫的隔離性,201427------
示範不同隔離等級下的並發問題
1.當把事務的隔離等級設定為read uncommitted ,會引發髒讀,不可重複讀取,虛讀
A視窗
start transaction isolation level read uncommitted;
start transaction;
select * from account;
=======這個時候發現aaa的賬戶是1000元,轉到B視窗
select * from acount where name=='aaa';
=======發現aaa的賬戶多了100元,這個時候a視窗讀到的資料時b視窗未提交的資料(髒讀);
B視窗
start transaction;(有這句話,不寫commit語句,資料是不會提交到資料庫的)
update account set money=money+100 where name='aaa';
------不要提交,轉到A視窗查詢
2..當把事務的隔離等級設定為read committed ,會引發不可重複讀取,虛讀,但可避免髒讀;
A視窗
start transaction isolation level read committed;
start transaction;
select * from account;
=======這個時候發現aaa的賬戶是1000元,轉到B視窗
select * from acount where name=='aaa';
=======發現aaa的賬戶多了100元,這個時候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 acount(name,money) values('ggg',1000);
commit;
-------轉到a視窗
4.當把事務的隔離等級設定為Serializable ,會避免所有的問題;
A視窗:
set transaction isolation level repeatable read;
start transaction ;
select * from account;
=======發現有4條記錄,轉到b視窗
B視窗
start transaction;
insert into acount(name,money) values('ggg',1000);
-------發現不能插入,只能等待a結束事務才能插入
資料庫的隔離等級
第四步的值為 0 第六步為100 第三步雖然更新了,但是沒有提交,還沒有寫入資料庫,所以第三步查詢的,仍為資料庫的原值。第五步做了一次提交 ,會把值寫入資料庫,查詢出來為更新值。 多線程的話就不一定了,可能出現髒讀的現象。既然有提交的話,就得看線程的優先順序別了。如果優先順序別一樣的話,就得看運氣咯。 總而言之 如果更新提交後,另外一個線程才執行查詢的話,肯定會查處更新後的值。如果只執行到更新,另一個線程執行了查詢的話,就會出現髒讀
資料庫基礎 事件的隔離性層級
這個應該和不同資料庫以及各自不同的鎖層級設定有關係。沒有相關資訊,沒法給出具體結果。