使用Insert Ignore(或类似)和唯一ID进行MySQL事务处理

时间:2010-06-28 16:36:05

标签: mysql transactions insert innodb

我正在使用MySQL + PHP。我有一些代码可以根据到期时间从自动付款表中生成付款(因此您可以计划未来的付款等)。自动脚本在站点上的活动之后运行,有时会同时运行两次。为了避免这种情况,我们为付款生成一个uuid,其中只有第n次付款才能进行特定的自动付款。我们还使用事务来封装整个支付生成过程。

作为其中一部分,如果存在重复的uuid,我们需要整个事务失败,但是获取实际的数据库错误将向用户显示错误。我可以在付款插入SQL中使用“插入忽略”吗?警告是否会导致交易失败?如果没有,当有重复的uuid时如何终止交易?

澄清一下:如果INSERT失败,我怎么能让它不抛出程序停止错误,而是杀死/回滚事务?

请注意,插入将在提交时失败,而不是在php中初始执行。

非常感谢!

2 个答案:

答案 0 :(得分:1)

也许有另一种方法 - 确保相同的UUID不会被读取两次,而不是依赖于查询失败。

我猜你在处理它并插入之前从另一个表中获取UUID。 您可以使用事务,然后在阅读记录时使用SELECT ... FOR UPDATE。这样您读取的记录就会被锁定。当您获得所有数据时,将status列更新为“已处理”并将COMMIT交易。 最后,确保进程不会读取状态为“已处理”的记录。

希望这会有所帮助......

答案 1 :(得分:0)

偶然发现了这一点。这是一个老问题,但我会尝试给出答案。

首先:确保您的付款作业一次只运行一个。猜猜这可以为你省去很多麻烦。

第二:如果您的更新语句在php中失败,请将其放在try-catch块中。这样你的mysql查询就会失败,但错误不会显示给用户,你可以处理它。

try {
   ... your mysql code here ....
} catch (Exception $e) {
   ... do whatever needs to be done in case of problem ...
}

请记住,异常有很多可能的来源。永远不要把失败的插入物作为理所当然的理由。