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) |
|