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

标签 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;

INSERT 语句可以运行,但第二条语句 UPDATE 语句将失败,因为 user_id 列的类型为 INTEGER。

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

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

最佳答案

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

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

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

关于mysql - 当其中一条语句在 MySQL 中失败时,事务不会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62611021/

相关文章:

mysql - 避免 UNION RESULT 上出现 "filesort"

php - 如何将输入时间的值插入到数据库表中?

c# - Entity Framework :Using Transaction Scope how to check whether DbContext has transaction?

terminal - MySQL如何导出400万条数据?

mysql - 如何显示SQL查询的访问路径

php - OrderBy Coupons 基于过期状态 Laravel

transactions - 如何改变 Neo4j 图中的所有元素

transactions - Sequelize CLS 事务未使用

MySQL 内连接时出现列错误

mysql - 使用 MySQL Workbench 修改数据库架构