事务在 Microsoft SQL Server 中的工作原理

How exactly transactions work in Microsoft SQL Server

我读到创建 for insert trigger 会隐式创建事务。所以我可以从触发器中回滚事务并“撤消”插入。

是这样吗?

create trigger TRIGGER_NAME 
on TABLE_NAME
for insert
as
    declare @someVar = ....

    if @someVar > 0 
    begin
        rollback transaction
    end

那么在那种情况下,如果@someVar大于0,插入将被取消,对吗?

create trigger TRIGGER_NAME 
on TABLE_NAME
for insert
as
    begin transaction
        declare @someVar = ....

        if @someVar > 0    
        begin
            rollback transaction
        end

        commit transaction

那样的话,insert也取消了吧?

当我们有两个 for insert trigger 用于相同的 table 时会发生什么,并且他们都这样做 rollback transaction 他们共享相同的隐式交易吗?

我遇到了一些复杂的事情,所以我尝试在每个触发器中创建我自己的显式事务,但是对于 begin transaction 我无法做任何事情来正确使用 inserted,我无法从中提取任何值。

其实一个事务就是会话的状态。没有其他的。因此,您可以处于交易状态或不处于交易状态。当您执行 SQL 查询(不同于“命令”)时,会有一个包含查询的隐式事务。当您在触发器代码中时,事务状态是活动的,您可以回滚或提交。如果在触发器代码中执行此命令(COMMIT 或 ROLLBACK)中的任何一个,您将引发一个执行...但是事务状态不再存在,直到您执行任何查询。

现在,如果您有多个触发器,则可以使用过程 sp_settriggerorder.

来管理触发器的串行执行优先级

不建议对同一操作使用多个触发器,除非您必须按特定顺序执行它们。作为我在课程中给出的示例,我将同一操作的触发器数量限制为三个,具有这种特殊的优先级:

  1. 触发基于集合的约束
  2. 操作过程的触发器(客户端应用程序)
  3. 触发跟踪