解決并發下的另外一個方法,隔離級别!!
首先建立一個account的表,插入資料,引擎為Innodb
1. 未送出讀(Read uncommitted)
允許髒讀,事務中的修改,即時沒有送出,對其它事務也是可見的
A查詢執行操作:1
2
3set session transaction isolation level read uncommitted;
start transaction;
select * from account;
結果是這樣的
B查詢執行操作:1
2
3set session transaction isolation level read uncommitted;
start transaction;
update account set account = account + 200 where id = 1;
B再運作1select * from account;
然而B執行的更新操作,并沒有手動送出,資料庫裡資料還是1 - 1000,而不是1200,需要真的更新到資料庫,需要commit
2. 送出讀(Read committed)
隻能讀取到已經送出的資料,但是出現不可重複讀情況
A執行操作:1
2
3
4
5set session transaction isolation level read committed;
start transaction;
update account set account=account - 200 where id = 1;
select * from account;
B執行操作:1select * from account;
不是800,????why????
A執行操作:1commit;
再執行B:
變為800!!!!
3. 可重複讀(Repeatable read)(MySQL預設級别)
保證在同一事務中多次讀取同樣資料的結果是一樣的,消除了不可重複讀,但是還存在幻影讀
A操作:1
2
3
4set session transaction isolation level repeatable read;
start transaction;
select * from account
B操作:1
2
3
4insert into account(id,account) value(3,1000);
commit;
select * from account;
插入成功
A操作:1select * from account
A兩次查詢,結果都是一樣的,解決了不可重複讀的問題!!!!
A操作:1insert into account (id,account) values(3,1000);
竟然報錯了!!!!!!!說這條資料存在,
這裡就出現了幻影讀問題!!!
4. 可串行化(Serializable)
強制事務串行執行。
需要加鎖實作,而其它隔離級别通常不需要。