測試你對MySQL事務與隔離等級的理解的一道題,mysql事務
之前寫過一篇《MySQL InnoDB 四種交易隔離等級 與髒讀、可重複讀、幻讀》
http://blog.csdn.net/seven_3306/article/details/27085275
這是我自己琢磨出來的一道關於MySQL事務和隔離等級的題目,請填寫問號部分的內容:
如果你能正確的說明出如下結果,那麼你應該對MySQL事物和隔離等級有一定的認識了。
如果不是,那麼可能你並不理解MySQL的事務和隔離等級。
另外這道題可以幫你理解為什麼有的時候會出現這個問題:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
理解了這個錯誤的原因,就可以解決這個問題了。
MySQL 資料庫有表
create table t(a int)engine=innodb,charset=utf8;
insert into t(a)values(0);
MySQL在兩個session中按照如下順序執行如下命令:
| session A |
session B |
| |
|
| set session transaction isolation level read committed; |
|
| SET AUTOCOMMIT=0; |
set session transaction isolation level read committed; |
| |
SET AUTOCOMMIT=0; |
| SELECT a FROM t; |
|
| 結果:0 |
|
| |
|
| |
SELECT a FROM t; |
| |
結果:0 |
| |
|
| |
|
| UPDATE t SET a = a+1; |
|
| SELECT a from t; |
|
| 結果:? |
|
| |
|
| |
|
| |
SELECT a from t; |
| |
結果:? |
| |
|
| |
UPDATE t set a=a+5; |
|
結果: |
| |
|
| |
|
| COMMIT;(ROLLBACK) |
|
| |
SELECT a FROM t; |
| |
結果:? (如果session A被rollback,則為?) |
| |
|
| |
COMMIT |
| |
|
| |
SELECT a FROM t; |
| |
結果:?(如果session A被rollback,則為?) |
| SELECT a FROM t; |
|
| 結果:?(如果session A被rollback,則為?) |
|
結果是:
| session A |
session B |
| |
|
| set session transaction isolation level read committed; |
|
| SET AUTOCOMMIT=0; |
set session transaction isolation level read committed; |
| |
SET AUTOCOMMIT=0; |
| SELECT a FROM t; |
|
| 結果:0 |
|
| |
|
| |
SELECT a FROM t; |
| |
結果:0 |
| |
|
| |
|
| UPDATE t SET a = a+1; |
|
| SELECT a from t; |
|
| 結果:1 |
|
| |
|
| |
|
| |
SELECT a from t; |
| |
結果:0 |
| |
|
| |
UPDATE t set a=a+5; |
| |
結果:被阻塞住了,再等待session A的事務提交,也就是等待session A釋放鎖 一、如果session A超過一定時間沒有釋放鎖(提交事務), 則session B因鎖等待逾時:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 2、如果session A在session B鎖等待逾時前提交了事務,則session B執行update a =a+1; Innodb鎖等待時間為:show variables like '%innodb_lock_wait_timeout%';(Global, Session層級) 3、如果session A在session B鎖等待逾時前執行了rollback,則session B執行update a=a+1; |
| |
|
| |
|
| COMMIT;(ROLLBACK) |
|
| |
SELECT a FROM t; |
| |
結果:(一、報錯。 二、6 三、如果session A被rollback,則為5) |
| |
|
| |
COMMIT |
| |
|
| |
SELECT a FROM t; |
| |
結果:(一、報錯。 二、6 三、如果session A被rollback,則為5 |
| SELECT a FROM t; |
|
結果一、如果session B鎖等待逾時,則為1 二、如果session B未逾時,且session A提交事務則為6 三、如果session A被rollback,則為5) |
|
思考,換成其它交易隔離等級,那麼結果又是什嗎?