MySQL 中当其中一条语句失败时事务不会回滚

fer*_*akp 4 mysql transactions mysql-workbench

我在这里进行简单的交易;

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;
Run Code Online (Sandbox Code Playgroud)

INSERT 语句将起作用,但第二条语句(UPDATE 语句)将失败,因为 user_id 列的类型为 INTEGER。

我想要一个事务,如果任何语句(事务内)失败,该事务将回滚。此交易的行为并非如此。

我使用INNODB引擎。为什么这个交易不成功?

pif*_*for 5

MYSQL 在事务级别没有“自动回滚”功能。

如果某个语句失败,则该语句将回滚,但事务不会回滚。如果运行 COMMIT,MySQL 会提交当前事务的所有非回滚语句:这就是所发生的情况。如果运行 ROLLBACK,则所有语句都会回滚,无论它们失败还是成功。

如果您想要不同的行为,您需要将其编码到应用程序代码中。这可以通过存储过程来完成:请参阅mysql transaction - roll back on any exception

  • 感谢你的回答!绝对令人大开眼界(我使用 Oracle 和 MS SQL Server 多年......也使用 MySQL 多年,但不经常使用事务)。我不得不说这几乎使事务变得毫无用处......太糟糕了,他们认为这个功能有意义......(自动回滚应该是事务的默认功能,因为重点是如果事情进展不顺利就回滚...... ) (3认同)