当 MySQL 中的其中一条语句失败时,事务不会回滚
Transaction doesn't rollback when one of the statements fail in MySQL
我这里有简单的交易;
START TRANSACTION;
INSERT INTO user_photos(id, user_id, meta, upload_timestamp) VALUES (1211, 1, '{"a"}',
from_unixtime(unix_timestamp()));
UPDATE user_photos set user_id = '{"test"}' WHERE user_id = 1;
COMMIT;
INSERT 语句将起作用,但第二个语句,UPDATE 语句将失败,因为 user_id 列的类型为 INTEGER。
我想要一个事务,如果任何语句(内部事务)失败,该事务将回滚。此交易的行为并非如此。
我用的是INNODB引擎。为什么这个交易不起作用?
MYSQL 在事务级别没有“自动回滚”功能。
如果某个语句失败,则回滚该语句但不回滚事务。如果您 运行 COMMIT,MySQL 会提交当前事务的所有非回滚语句:这就是发生的情况。
如果你 运行 ROLLBACK,所有语句都会回滚,无论它们是失败还是成功。
如果您想要不同的行为,您需要在您的应用程序代码中对其进行编码。
这可以通过存储过程完成:参见 mysql transaction - roll back on any exception.
我这里有简单的交易;
START TRANSACTION;
INSERT INTO user_photos(id, user_id, meta, upload_timestamp) VALUES (1211, 1, '{"a"}',
from_unixtime(unix_timestamp()));
UPDATE user_photos set user_id = '{"test"}' WHERE user_id = 1;
COMMIT;
INSERT 语句将起作用,但第二个语句,UPDATE 语句将失败,因为 user_id 列的类型为 INTEGER。
我想要一个事务,如果任何语句(内部事务)失败,该事务将回滚。此交易的行为并非如此。
我用的是INNODB引擎。为什么这个交易不起作用?
MYSQL 在事务级别没有“自动回滚”功能。
如果某个语句失败,则回滚该语句但不回滚事务。如果您 运行 COMMIT,MySQL 会提交当前事务的所有非回滚语句:这就是发生的情况。 如果你 运行 ROLLBACK,所有语句都会回滚,无论它们是失败还是成功。
如果您想要不同的行为,您需要在您的应用程序代码中对其进行编码。 这可以通过存储过程完成:参见 mysql transaction - roll back on any exception.