这不会引起竞争条件与MySQL(少):

  1. 启动交易。

  2. 尝试得到记录。

  3. 如果记录不存在,返回。

  4. 如果记录存在,删除它,并添加一个日志条目说是已被删除。

  5. 结束交易(承诺/rollback).

是否有可能为另一个进程开始之前删除一步2b、检测存在的记录,然后有两个过程的输入项目删除的项目成本日志?

是否有任何防范措施,我需要走?

谢谢。

有帮助吗?

解决方案

使用"选择"用于更新在第2步。只有一个进程将能够获得锁上排,从而避免了这种情况下,你的描述。

其他提示

熟练工人的程序员,我相信,有正确的解决方案。因为你表示你正在使用一个虚格林工具(一个不会让你来查询更新)我建议你移动你的插入的记录表进入一个触发器上删除操作,所以你会避免重复输入。

启动交易。

删除记录/*使用同样的标准使用'尝试得到记录'*/

如果回应的指示的记录确实被删除,增加一个日志条目。

结束交易(承诺/rollback).

没有更多的竞争条件。

是的,这是可能用于另一交易的检查表之后已经阅读它。

更糟糕的是,因为交易的工作,即使删除该行,任何新的交易,开始将看到行因为你还没有致力于该删除。

SELECT ... FOR UPDATE 是的一种方式防止它。

LOCK TABLE tablename 是另一个。

不幸的是,因为你使用一个奥姆,我不能说它是否有能力做到这些.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top