对于大多数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似乎只回滚失败的语句,这是毫无意义的,因为它无论如何都失败了。
回滚整个事务需要什么?