INSERT INTO `temp`.`cs` (`id`, `num`) VALUES (1, 1);
INSERT INTO `temp`.`cs` (`id`, `num`) VALUES (2, 2);
INSERT INTO `temp`.`cs` (`id`, `num`) VALUES (3, 3);
假设场景2的代码如下:
start transaction;
update cs set num = 13 where id = 1;
SELECT * FROM `cs`;
commit;
场景3的代码如下:
start transaction;
SELECT * FROM `cs`;
update cs set num = 13 where id = 1;
commit;
复制代码
对场景2,同一个事务内,先实行update,事务没提交,能读取到最新的数据吗?
能。
步骤SQL补充1start transaction;开启事务2select num from cs where id = 1;num值是13update cs set num = 12 where id = 1;更新num值为124select num from cs where id = 1;num值是125rollback;回滚事务都说不加锁的select是快照读,为什么select还能读取当前事务的最新数据?
步骤事务A事务B补充1start transaction;start transaction;两边开启事务,模拟并发请求2update cs set num = 1234 where id = 1;update cs set num = 1234;两个差别where范围的update,模拟线上的场景3/壅闭事务A的行X锁,壅闭了事务B的表X锁4select * from cs where id = 1;壅闭这一步很重要,优化就是为了制止这一步的壅闭耗时,特别是慢查询5commit;壅闭事务A提交6/select * from cs where id = 1;事务A完成,事务B不会再壅闭了7/commit;结束事务B
步骤事务A事务B补充1start transaction;start transaction;两边开启事务,模拟并发请求2select * from cs where id = 1;select * from cs where id = 1;两个事务不加锁不壅闭,这一步的壅闭时间省了3update cs set num = 1234 where id = 1;update cs set num = 1234;两个事务更新4/壅闭两个X锁范围有冲突,壅闭5commit;壅闭事务A提交6/commit;事务B提交所以说,只要业务允许,调解SQL语句的实行顺序,高并发环境下,就能得到不小的性能提升,但是这一点很容易忽略。