天天看點

mysql解決并發問題_MySQL(四) 如何解決并發問題

解決并發下的另外一個方法,隔離級别!!

首先建立一個account的表,插入資料,引擎為Innodb

mysql解決并發問題_MySQL(四) 如何解決并發問題

1. 未送出讀(Read uncommitted)

允許髒讀,事務中的修改,即時沒有送出,對其它事務也是可見的

A查詢執行操作:1

2

3set session transaction isolation level read uncommitted;

start transaction;

select * from account;

結果是這樣的

mysql解決并發問題_MySQL(四) 如何解決并發問題

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;

mysql解決并發問題_MySQL(四) 如何解決并發問題

然而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;

mysql解決并發問題_MySQL(四) 如何解決并發問題

B執行操作:1select * from account;

mysql解決并發問題_MySQL(四) 如何解決并發問題

不是800,????why????

A執行操作:1commit;

再執行B:

mysql解決并發問題_MySQL(四) 如何解決并發問題

變為800!!!!

3. 可重複讀(Repeatable read)(MySQL預設級别)

保證在同一事務中多次讀取同樣資料的結果是一樣的,消除了不可重複讀,但是還存在幻影讀

A操作:1

2

3

4set session transaction isolation level repeatable read;

start transaction;

select * from account

mysql解決并發問題_MySQL(四) 如何解決并發問題

B操作:1

2

3

4insert into account(id,account) value(3,1000);

commit;

select * from account;

mysql解決并發問題_MySQL(四) 如何解決并發問題

插入成功

A操作:1select * from account

mysql解決并發問題_MySQL(四) 如何解決并發問題

A兩次查詢,結果都是一樣的,解決了不可重複讀的問題!!!!

A操作:1insert into account (id,account) values(3,1000);

mysql解決并發問題_MySQL(四) 如何解決并發問題

竟然報錯了!!!!!!!說這條資料存在,

這裡就出現了幻影讀問題!!!

4. 可串行化(Serializable)

強制事務串行執行。

需要加鎖實作,而其它隔離級别通常不需要。

mysql解決并發問題_MySQL(四) 如何解決并發問題