我需要在一堆表中进行 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/