使用插入忽略(或类似)和唯一 ID 进行 MySQL 事务处理

标签 mysql transactions insert innodb

我正在使用 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/

相关文章:

mysql - 如何在sql中编写多条记录的更新和内部查询

mysql - 触发器阻止记录插入

java - JPA EntityManager 在 @Transactional 方法之后阻塞

mysql - 将 mysql insert 与独立的 WHERE 语句结合起来

MySQL INSERT INTO 查询在 C 中太慢

php - 数据未在 php 中使用 $_SESSION 变量插入

MySQL 为什么在此查询中 Distinct 关键字在自然语言模式下不起作用?

mysql - 有没有办法在一个查询中包含多个 IN 子句?

javascript:如何保持事务(WebSql)事件

java - 在 Spring @Transactional 中保存多个实体的 JPA 不回滚并启用 Exception.class 回滚