mysql 独占锁被越过(两个事务同时获得锁)

阿牛哥818 2016-07-07 03:36:21
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
...全文
343 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
akxj2022 2017-11-27
  • 打赏
  • 举报
回复
https://www.cnblogs.com/zhaoyl/p/4121010.html
阿牛哥818 2017-11-27
  • 打赏
  • 举报
回复
引用 6 楼 amqvje 的回复:
[quote=引用 4 楼 zjcxc 的回复:] 既然是迸发,你如何确定 DB 收到的处理顺序是你程序要的 123456的执行顺序?
根据DB反馈的lock_time,就能确定事务执行的顺序。[/quote] lock_time 是获得锁以后记录的时间。因为事务是阻塞状态,单独一个事务,从lock_time到commit的时间段内(l2c),理论上是其它事务都不能在l2c时间内获得锁。而事务2的l2c时间段内,事务3竟然能获得锁,这个就不符合预期。
阿牛哥818 2017-11-27
  • 打赏
  • 举报
回复
引用 4 楼 zjcxc 的回复:
既然是迸发,你如何确定 DB 收到的处理顺序是你程序要的 123456的执行顺序?
根据DB反馈的lock_time,就能确定事务执行的顺序。
阿牛哥818 2016-07-14
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
这个不太可能吧。

在这种隔离级别模式下,每个事务,由于都要获取并修改数据,都要申请锁,而前一个事务已经对要处理的数据,加上了锁,还没有释放,所以后面的事务就被暂时阻塞住了。

应该不可能出现,你说的情况,不过如果是并发的时候,1,2,3,4,5,6同时运行,是有可能出现 事务3先运行,然后事务2再运行的情况



这个是图片 数据的图形化。实测数据。
zjcxc 2016-07-14
  • 打赏
  • 举报
回复
你的事务操作前有一堆处理,就算你程序控制一下,保证了1-6的DB接收顺序,也无法保证进入事务时是1-6的顺序啊
zjcxc 2016-07-14
  • 打赏
  • 举报
回复
既然是迸发,你如何确定 DB 收到的处理顺序是你程序要的 123456的执行顺序?
LongRui888 2016-07-08
  • 打赏
  • 举报
回复
这个不太可能吧。 在这种隔离级别模式下,每个事务,由于都要获取并修改数据,都要申请锁,而前一个事务已经对要处理的数据,加上了锁,还没有释放,所以后面的事务就被暂时阻塞住了。 应该不可能出现,你说的情况,不过如果是并发的时候,1,2,3,4,5,6同时运行,是有可能出现 事务3先运行,然后事务2再运行的情况
大雨将至 2016-07-07
  • 打赏
  • 举报
回复
你的多个事务读的$id相同吗? 你这个语句只是行级锁,如果事务3和事务2读取的行不一样,是不会被block的

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧