【问题标题】:How to execute N inserts in mysql and in a "all or nothing " mode如何在 mysql 和“全有或全无”模式下执行 N 次插入
【发布时间】:2019-06-14 23:03:19
【问题描述】:

我需要在一堆表中进行 N 次插入,但如果其中任何一个失败,我希望滚动所有插入。

我正在使用 MySql 8.0 和 InnoDB,我花了很多时间试图让它发挥作用,并且我已经读到我应该使用事务来实现这一点,但它没有按照我想要的方式工作,我没有不知道怎么解决。

这是表的定义:

CREATE TABLE IF NOT EXISTS `Example` (
  `A` VARCHAR(30) NOT NULL,
  `ID` int NOT NULL,
  PRIMARY KEY (`ID`)
);

表只包含记录(“abc”,1)

所以我执行

START TRANSACTION;
INSERT INTO `Example` (`A`, `ID`) VALUES ("abd", 2);
INSERT INTO `Example` (`A`, `ID`) VALUES ("abc", 1);
COMMIT;

在事务(“abd”,2)被添加到表之后。 我希望表上没有任何更改,因为事务中的第二次插入失败

【问题讨论】:

  • 如果有错误你应该使用ROLLBACK;而不是COMMIT;
  • 你是如何执行查询的?
  • 但是我怎么知道是否发生了错误呢?
  • 如果您手动执行查询,您应该会看到一条错误消息。如果您是使用编程语言进行的,它应该提供一种测试查询是否成功的方法。
  • 我正在通过 Mysql 工作台执行它们,但是如何设置一些行为,例如“如果它失败回滚,否则继续”?

标签: mysql sql transactions innodb


【解决方案1】:

您的事务分界层是错误的。您正在执行COMMIT,无论第三条语句是成功还是失败(它失败了)。

这可能是由于在命令行中执行的语句,一个接一个,没有考虑错误情况。

诸如 Spring、JTA 等事务 API 会在第三条语句失败时“破坏”事务,并且在此之后永远不会兑现提交。他们会将提交转换为回滚。

例如,在 Spring 中,您通过使用 @Transactional 注释标记方法来划分事务。您永远不会以编程方式执行提交或回滚;当方法完成时,Spring 会为您执行此操作。在这种情况下,方法抛出的任何RuntimeException 都会导致事务失败,并且当方法完成执行时 Spring 将回滚。否则,它将提交事务。

【讨论】:

  • 谢谢你的回答,我从来没有用过spring,我知道java,我刚刚开始使用servlet和jsp,你能给我一个例子来说明你将如何解决我的问题吗?
猜你喜欢
  • 2012-12-14
  • 2011-01-06
  • 2016-02-18
  • 2018-12-30
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2015-05-24
相关资源
最近更新 更多