繁体   English   中英

如何防止在处理行时选择该行?

[英]How to prevent selection of the row while it is being handled?

我有带有列is_locked MySQL(InnoDB)表,该表显示记录的当前状态(现在是由系统处理还是不由系统处理)。

另一方面,我有许多执行SELECT * FROM table_name WHERE is_locked = 0节点,然后处理从该表获得的行。

在我的代码中,我这样做:

  1. 系统从数据库获取行( SELECT * FROM table_name WHERE is_locked = 0
  2. 系统通过命令UPDATE table_name SET is_locked = 1 WHERE id = <id>锁定行

问题:节点运行非常快,所有节点都可能获得同一行,然后它们首先更新该行并将is_locked设置为1

我发现了表的锁定,但我认为这不是正确的方法。 谁能告诉我如何处理这种情况?

我建议两件事:

  • 将选择范围限制为一个,因为您要处理并发问题,因此每次迭代最好取较小的“位数”

  • 使用事务,这使您可以启动事务,获取记录,将其锁定然后提交事务。 这将迫使mysql强制执行您的并发锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM