当其中一个引发错误时,如何从处理程序中回滚所有事务语句?

Posted

技术标签:

【中文标题】当其中一个引发错误时,如何从处理程序中回滚所有事务语句?【英文标题】:How to rollback all transaction statements from handler when one of them throws an error? 【发布时间】:2019-07-23 07:47:59 【问题描述】:

我有以下 SQL 存储过程:

BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK; 
    END;

    START TRANSACTION;
        INSERT INTO users (user_id) VALUES (55556666);
        DROP TABLE xaxa;
    ROLLBACK; 
END

DROP TABLE xaxa; 语句会引发错误,因为这样的 DB 不存在,但是,执行 INSERT 语句并且在 phpmyadmin 中我可以看到插入的用户。 但是,如果我删除麻烦的语句DROP TABLE xaxa; INSERT 被回滚。 如果可能的话,有人可以帮我从处理程序中回滚插入吗?

【问题讨论】:

【参考方案1】:

DROP TABLE 语句不能回滚,它会导致隐式提交。 https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

【讨论】:

以上是关于当其中一个引发错误时,如何从处理程序中回滚所有事务语句?的主要内容,如果未能解决你的问题,请参考以下文章

使用栈处理回滚

如何使用@Async 和@Transactional 在多线程中回滚?

如何在 SQL Server 中回滚或提交事务

事务未在春季批处理项目编写器中回滚

关于调用方有事务,被调用的SP中也有事务,在嵌套SP中回滚代码的报错处理,好文推荐

Spring - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚