在我的代码中,我需要执行以下操作:
检查MySQL表(InnoDB)是否存在特定行(符合某些条件)。如果是,请将其退回。如果没有,请创建它,然后将其返回。
我似乎遇到的问题是竞争条件。每隔一段时间,两个进程就会紧密地运行在一起,它们同时检查表,不看行,并且都插入它 - 因此重复数据。
我正在阅读MySQL文档,试图想出一些方法来防止这种情况发生。我到目前为止所做的事情:
SERIALIZABLE
级别的交易也不会阻止INSERT
,期间。SELECT ... LOCK IN SHARE MODE
或SELECT ... FOR UPDATE
。LOCK TABLE ... WRITE
可以做到,但这是一个非常激烈的措施 - 其他进程无法从表中读取,我需要锁定我打算使用的所有表直到我解锁它们。基本上,我想要执行以下任一操作:
INSERT
/ SELECT
的情况下阻止表格中的所有UPDATE
进入表格(这可能是不可能的,因为它在大多数情况下都没有意义)。< / LI>
答案 0 :(得分:0)
我想我自己找到了答案。 InnoDB表中的事务+ SELECT ... FOR UPDATE
可以提供同步锁(也就是互斥锁)。让所有进程在开始工作之前锁定特定表中的特定行。然后只有一个能够一次运行,其余的将等到第一个完成其交易。