当事务 DML 操作引发异常时,触发器中会发生啥

Posted

技术标签:

【中文标题】当事务 DML 操作引发异常时,触发器中会发生啥【英文标题】:What happens in a trigger when an transaction DML operation throws an exception当事务 DML 操作引发异常时,触发器中会发生什么 【发布时间】:2016-05-11 09:36:54 【问题描述】:

SQLServer 中的以下代码:

BEGIN TRY

  BEGIN TRANSACTION TRAN
    UPDATE Authors
    SET Phone = '415 354-9866'
    WHERE au_id = '724-80-9391';

  COMMIT TRAN    
END TRY

BEGIN CATCH 
   ROLLBACK TRAN
END CATCH

在 authors 表中有一个触发器。意味着在更新触发器之前将新记录插入到临时表中。查询:

    如果在作者表中更新时发生异常。因为触发器同时插入新记录。当 select update 语句在事务中时,新记录是否会回滚? 如果在插入新记录时侧触发器中发生异常,那么会发生什么意味着它将更新或回滚作者表?

【问题讨论】:

【参考方案1】:

事务的概念是:如果您进行回滚,数据库将恢复到与事务实际启动时完全相同的状态。

遵循此概念,此事务中任何触发器所做的所有更改也会回滚。

实际上,这同样适用于单个语句(如您的示例中),即使没有显式事务 - 此单个语句然后创建一个隐式事务,并且触发器执行是此事务的一部分。如果有任何失败,隐式事务也会回滚,包括触发器的更改,使数据库保持原来的状态。

这是数据库可以保证数据一致性的唯一方法!

【讨论】:

以上是关于当事务 DML 操作引发异常时,触发器中会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

“创建后”触发器中的未处理异常阻止创建

数据库:触发器

MySQL学习笔记-事务

oracle--事物---

SQLServer触发器

当 Python 3 中已经存在异常时引发异常