MySQL 在处于Repeatable-Read 事务隔离级别下时, 两个事务之间的修改在读上不会相互影响,在写上却会受到影响
例子
1.
事务A
事务B
现在事务A B看到的数据是一样的
2.
事务A更新
事务B查询
可见 在 读上AB互不影响,因为B看到的还是原来的数据
3.
B更新,更新被挂起,因为A执行了更新且事务还没提交
A提交事务
A提交事务后,B的更新操作得以执行,但是更新却影响了0行
4.
B都提交事务
A,B再查询
可见结果是A的修改结果,所以多事务同时修改同一条记录并不会出现我们不期待的结果(A改完以后B又改成了另一个值),只不过很奇怪的是在事务内update对select没有影响,对update确实有影响的
______________________________________________
另外,如果是使用for update来查询,也是可以即时看到别的事务的更新的结果的,由于for update需要获取排他锁,所以它必须在别的事务的更新行为结束且事务提交以后才能继续执行,那么这样会有一个很奇异的结果,那就是for update的select查询能看到跟新的结果,而直接用select查询时无法看到最新查询结果的,如下
事务A开始事务并执行更新
现在oldroot已经被跟新为newroot
2. B事务执行for update 查询会被挂起,因为这一行被加了排他锁
3. A提交事务, B被挂起的操作会继续执行,然而却得到了空集,因为for update的查询是可以及时获取最新数据的,而此时oldroot已经被改为了newroot
同时,我们在事务B执行对newroot的for update查询,是可以得到结果的,然而如果没有for update,得到的又是空集
事务A提交
事务B查询