无法检查MySQL中的行状态(已锁定或未锁定)

时间:2011-01-26 12:05:36

标签: mysql database locking

在我的应用程序中,我需要在编辑这些行时锁定某些行。如果另一个用户将对该行进行选择,则他的查询将需要等到第一个用户释放锁定。我的问题是我需要查看查询是否在等待,因此在这种情况下能够为进行查询的用户进行预约。你对这种情况有什么建议吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果您在MySQL中使用事务,并且如果您使用最新版本的MySQL(> 5.1),则只需在事务中的目标行内部中进行选择查询即可设置行锁(而不是之前)。

以并行运行的查询将自动等待,直到第一个事务结束。除非您进行非常长的交易,否则此等待时间不会很长,并且该过程将在第一个交易结束后继续。除非您的治疗时间超过15秒,否则通过在锁定情况下中止您的交易,向您的最终用户发送回复并稍后重做交易,您将失去更多时间。“/ p>

MySQL有一个锁定的超时设置(锁定等待超时),您可以将此超时调整到一个非常低的值(假设为3s),如果您的锁定,您将获得异常等待太久了,那么你必须中止你的交易,但默认情况下让MySQL做锁定&如果发生锁定,请在不破坏交易的情况下等待管理。

无论如何,您应该为应用程序代码使用异常捕获循环来捕获这些超时以及死锁检测异常。应该做的经典事情是,案例是重新启动整个事务直到它工作,但如果你想要你也可以中止整个事情并告诉用户他应该等待(但在90%的情况下,这比在不考虑用户交互的情况下重做事务。)

答案 1 :(得分:1)

不是解决方案,而是解决方法

也许您可以尝试向表中添加状态列,初始值可以为PENDING

  • 仅选择PENDING
  • 的记录
  • 开始交易时将状态更新为IN-PROGRESS
  • 处理完记录后更新为DONE

如果您想重试由于某种原因而失败的交易, 添加一个process_start_timeupdated_at字段,如果状态为IN-PROGRESS的时间超出预期,则可以将其重置为PENDINGFAILED并添加一个尝试机制