mysql - 如何在mysql中以 "all or nothing "模式执行N次插入

标签 mysql sql transactions innodb

我需要在一堆表中进行 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) 添加到表后。 我希望表上不会有任何更改,因为事务内的第二次插入失败

最佳答案

您的交易划分层是错误的。无论第三条语句成功还是失败(失败),您都在执行COMMIT

这可能是由于在命令行中逐个执行语句而没有考虑错误条件。

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

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

关于mysql - 如何在mysql中以 "all or nothing "模式执行N次插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56606002/

相关文章:

sql-server - SSIS:启用事务导致数据库连接失败

mysql - 从同一表列更新列

php - 左连接 2 个表时如何减少 MySQL 上的用户优先级字段?

MySQL 联合子查询

mysql - SQL:如何使用分组依据或类似方式进行选择,以及如何在新列中获取被忽略的值?

MYSQL 1064 事务插入多个表

php - 检查用户以html形式输入的数据是否已存在于php的数据库中

sql - 林克;如何执行多个条件的左外连接?

sql - 为什么当我做两个连接时 COUNT 的结果是双倍的?

java - java EE 中的事务是什么?