时间:2021-07-01 10:21:17 帮助过:55人阅读
如果你能正确的说明出如下结果,那么你应该对MySQL事物和隔离级别有一定的认识了。
如果不是,那么可能你并不理解MySQL的事务和隔离级别。理解了这个错误的原因,就可以解决这个问题了。
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) |