我正在使用 MySQL + PHP。我有一些代码可以根据到期时间从自动付款表生成付款(以便您可以计划 future 的付款...等)。自动脚本在站点上的事件之后运行,有时会同时运行两次。为了避免这种情况,我们为付款生成一个 uuid,其中特定自动付款只能有第 n 次付款。我们还使用交易来封装整个支付生成过程。
作为其中的一部分,如果存在重复的 uuid,我们需要整个事务失败,但获得实际的数据库错误将向用户显示错误。我可以在付款插入SQL中使用插入忽略吗?警告会终止交易吗?如果没有,当有重复的 uuid 时如何终止事务?
澄清一下:如果 INSERT 失败,我怎样才能让它不抛出程序停止错误,而是终止/回滚事务?
请注意,插入将在提交时失败,而不是在 php 中初始执行时失败。
非常感谢!
最佳答案
也许还有另一种方法 - 确保相同的 UUID 不会被读取两次,而不是依赖于查询失败。
我猜您在处理和插入之前从另一个表获取了 UUID。
您可以使用事务,然后在读取记录时SELECT ... FOR UPDATE
。这样你读取的记录就被锁定了。当您获取所有数据时,将 status
列更新为“已处理”并COMMIT
事务。
最后,确保进程不会读取状态为“已处理”的记录。
希望这有帮助...
关于使用插入忽略(或类似)和唯一 ID 进行 MySQL 事务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134277/