2025-07-08

這是我自己琢磨出來的一道關於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)
 

思考,換成其它事務隔離級別,那麼結果又是什麼?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *