PHP程序流程:
开启事务
一堆SQL执行
for update 读表A
update 存表A
一堆SQL执行
for update 读表B
update 存表B
一堆SQL执行
commit
假定6个事务同时对上面的PHP程序进行(并发)请求
1,2,3,4,5,6是连续的六条记录,按记录更新时间升幂排序,记录图如下:
(表B的记录)
预计结果:commit1_time<lock_time2<commi_time2<lock_time3<commit_time3<.....<commit_time6
实际结果():commit_time2<lock_time3 (事务二未提交,事务三竟然能获得锁)
结论:事务3越过了事务二已获得的锁,读到了事务二未更新时的数据。
期望:事务3获取事务2更新后的数据
问题:这可能是什么原因导致的?如何达成期望?
注:
1)表A并未记录相关的时间;
2)表B各字段意思:
lock_time:执行 selece * from tableB where id = $id for update; 的时间(毫秒)
update_time:执行 update tableB set column = column_set; 的时间(毫秒)
commit_time:提交时间(毫秒)
3)表B数据来源:
使用PHP操作文件记录日志,时间来源于函数microtime(true);
4) PHP Version 5.6.7
5)MYSQL版本 5.5.46
6)mysql事务隔离级别:repeatable read
7)环境:WIN10+NGINX+PHP+MYSQL