我有一个mysql(innodb)表 is_locked
它显示记录的当前状态(是否由系统处理)。
另一方面,我有许多执行 SELECT * FROM table_name WHERE is_locked = 0
然后从这个表中得到行。
在我的代码中,我这样做:
系统从db获取行( SELECT * FROM table_name WHERE is_locked = 0
)
系统通过命令锁定行 UPDATE table_name SET is_locked = 1 WHERE id = <id>
问题:节点运行速度非常快,所有节点都可能获得相同的行,然后第一个节点将更新行并设置 is_locked
到1
我发现table被锁上了,但我认为这不是正确的方法。有谁能告诉我,怎样处理这样的案件吗?
1条答案
按热度按时间jucafojl1#
我推荐两件事:
将您的select限制为一个,因为您正在处理并发性问题,所以最好在每次迭代中采用较小的“bits”
使用事务,这允许您启动事务、获取记录、锁定它,然后提交事务。这将强制mysql执行并发锁。