【问题标题】:Transaction doesn't rollback when one of the statements fail in MySQL当其中一个语句在 MySQL 中失败时,事务不会回滚
【发布时间】:2020-10-18 00:23:35
【问题描述】:

我这里有简单的交易;

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 transactions mysql-workbench


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!绝对令人大开眼界(我已经使用 Oracle 和 MS SQL Server 多年......也使用 MySQL 多年,但不经常用于事务)。我不得不说这几乎使事务无用......太糟糕了,他们认为这个功能是有意义的......(自动回滚应该是事务的默认功能,因为如果事情不顺利,关键是回滚...... )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    相关资源
    最近更新 更多