确保MySQL事务在提交时失败

确保MySQL事务在提交时失败,mysql,testing,transactions,Mysql,Testing,Transactions,我想测试一个脚本,当MySQL事务失败时它会做什么。所以我想在COMMIT上模拟事务失败 镜像脚本打开一个事务,进行一些查询,然后提交该事务。我想向事务插入一些额外的查询,以确保事务在提交时失败。因此,我可以测试脚本如何从事务失败中恢复 我不想使用显式的回滚。我想模拟一下当提交失败时的实际情况。确切的数据库结构并不重要。它可以适应解决方案 Edit:我需要事务在COMMIT上失败,而不是在之前的某个查询上失败。因此,在COMMIT之前回滚的答案不是我想要的。比如这个: 我失败的尝试: 插入具有

我想测试一个脚本,当MySQL事务失败时它会做什么。所以我想在
COMMIT
上模拟事务失败

镜像脚本打开一个事务,进行一些查询,然后提交该事务。我想向事务插入一些额外的查询,以确保事务在提交时失败。因此,我可以测试脚本如何从事务失败中恢复

我不想使用显式的
回滚
。我想模拟一下当提交失败时的实际情况。确切的数据库结构并不重要。它可以适应解决方案

Edit:我需要事务在
COMMIT
上失败,而不是在之前的某个查询上失败。因此,在
COMMIT
之前回滚的答案不是我想要的。比如这个:

我失败的尝试:

  • 插入具有无效PK或FK的行时,使用insert立即失败。暂时禁用带有
    外键\u checks=0的FK检查没有帮助,因为它们不会在
    提交时重新检查。如果是psql,可解除的约束将有所帮助。但在mysql中不是这样

  • 打开两个并行事务并在两个事务中插入具有相同PK的行(或具有唯一常量的任何列),在插入时锁定后一个事务并等待前一个事务。因此,事务在插入时回滚,而不是在提交时回滚


    • 因此我相信您可以尝试以下方法

    • 两阶段提交:使用两个数据库(第一个和第二个)并使 使用两阶段提交。当commit语句应该是 您可以关闭第二个数据库。这样你的承诺 操作将失败,事务将回滚
    • 您执行了几次插入,在提交之前,您的数据库服务器已死亡。如果事务没有接收到提交,它可能会失败

    • 希望能有帮助

      这可能会有帮助,我喜欢烧掉你的硬盘idea@P.Salmon谢谢你的链接。我看到了这些答案,但都太理论化了。在MySQL中,使用常量和超时的方法似乎不起作用。我开始好奇在MySQL中,
      COMMIT
      是否真的会失败。到目前为止,只有在
      COMMIT
      之前我杀死了MySQL服务器,我才设法使
      COMMIT
      失败。但这对于自动化测试来说不是很方便:-/