如果你能正確的說明出如下結(jié)果,那么你應(yīng)該對MySQL事物和隔離級別有一定的認(rèn)識了。
如果不是,那么可能你并不理解MySQL的事務(wù)和隔離級別。理解了這個錯誤的原因,就可以解決這個問題了。
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; | |
結(jié)果:0 | |
SELECT a FROM t; | |
結(jié)果:0 | |
UPDATE t SET a = a+1; | |
SELECT a from t; | |
結(jié)果:? | |
SELECT a from t; | |
結(jié)果:? | |
UPDATE t set a=a+5; | |
結(jié)果: | |
COMMIT;(ROLLBACK) | |
SELECT a FROM t; | |
結(jié)果:? (如果session A被rollback,則為?) | |
COMMIT | |
SELECT a FROM t; | |
結(jié)果:?(如果session A被rollback,則為?) | |
SELECT a FROM t; | |
結(jié)果:?(如果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; | |
結(jié)果:0 | |
SELECT a FROM t; | |
結(jié)果:0 | |
UPDATE t SET a = a+1; | |
SELECT a from t; | |
結(jié)果:1 | |
SELECT a from t; | |
結(jié)果:0 | |
UPDATE t set a=a+5; | |
結(jié)果:被阻塞住了,再等待session A的事務(wù)提交,也就是等待session A釋放鎖 一、如果session A超過一定時間沒有釋放鎖(提交事務(wù)), 則session B因鎖等待超時:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 2、如果session A在session B鎖等待超時前提交了事務(wù),則session B執(zhí)行update a =a+1; Innodb鎖等待時間為:show variables like '%innodb_lock_wait_timeout%';(Global, Session級別) 3、如果session A在session B鎖等待超時前執(zhí)行了rollback,則session B執(zhí)行update a=a+1; |
|
COMMIT;(ROLLBACK) | |
SELECT a FROM t; | |
結(jié)果:(一、報(bào)錯。 二、6 三、如果session A被rollback,則為5) | |
COMMIT | |
SELECT a FROM t; | |
結(jié)果:(一、報(bào)錯。 二、6 三、如果session A被rollback,則為5 | |
SELECT a FROM t; | |
結(jié)果![]() 二、如果session B未超時,且session A提交事務(wù)則為6 三、如果session A被rollback,則為5) |
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com