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

时间:2018-09-29 07:09:21

标签: php mysql sql

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

另一方面,我有许多节点执行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

我发现表的锁定,但是我认为这不是正确的方法。 谁能告诉我如何处理此类案件?

1 个答案:

答案 0 :(得分:0)

我推荐两件事:

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

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