以下测试数据都是在RR隔离级别下
情况1
事务A 先执行
START TRANSACTION;
select * from t where id=1;
SELECT SLEEP(10);
update t set value=value+1 where id=1;
select * from t where id=1;
COMMIT;
事务B 后执行
START TRANSACTION;
update t set value=value+1 where id=1;
COMMIT;
执行流程
事务A | 事务B |
---|---|
开启事务 | |
select * from t where id=1 | |
开启事务 | |
update t set v=v+1 where id=1 | |
提交事务 | |
update t set v=v+1 where id=1 | |
select * from t where id=1 | |
提交事务 | |
事务A 第一次查下结果 | |
事务A 第二次查下结果 | |
可以发现id=1的行的值会受其他事务修改所影响
情况2
查看是否会影响其他行
#事务A
START TRANSACTION;
select * from t;
SELECT SLEEP(10);
update t set value=value+1 where id=1;
select * from t;
COMMIT;
#事务B
START TRANSACTION;
update t set value=value+1 where id=1;
update t set value2=value2+1 where id=2;
COMMIT;
结果:只会影响事务A中有修改的行(id=1)
备注
mysql 发生行锁抢占,只有事务结束后才会释放锁