MariaDB-回滚整个交易

3周前#Mysql

对于大多数DBMS,当事务中的一条语句失败时,整个事务都会回滚。例如:

DROP TABLE IF EXISTS test;
CREATE TABLE test (
    id INT PRIMARY KEY AUTO_INCREMENT,
    code INT CHECK(code>0),
    data VARCHAR(255)
) ENGINE=INNODB;

INSERT INTO test(code,data) VALUES(23,'apple');

START TRANSACTION;

INSERT INTO test(code,data) VALUES(45,'banana');
INSERT INTO test(code,data) VALUES(-3,'banjo');     --  error

COMMIT;

SELECT * FROM test;

https://dbfiddle.uk/HJ931cvG
事务之前的语句应该成功。该事务包含一个失败的插入,因此应该回滚该事务。这不是交易的全部意义吗?
当我从测试中选择*FROM时,我得到了在事务中添加的香蕉行。
MySQL/MariaDB似乎只回滚失败的语句,这是毫无意义的,因为它无论如何都失败了。
回滚整个事务需要什么?

回答
G
Gladyce Bartell IV
3周前

回滚整个事务所需的是您编写代码来执行 ROLLBACK(或等效的 API 调用)。

单个失败的语句不会回滚整个事务的原因是让您有机会重试该语句,或者进行一些替代更改,或者您认为适合您的应用程序的任何内容。