有什么方法可以找出触发器内部是否存在打开的包装器事务?

时间:2015-07-22 06:35:14

标签: sql-server transactions

当我们进入触发器并在进入触发器之前打开一个事务时,@@ TranCount显示1,与我们没有打开该事务时相同。 那么有没有办法找出在这种情况下是否有一个开放的包装器事务?

PS:我有一个触发此触发器的表。可以使用/不使用包装器事务在不同的位置操作此表。我需要知道触发器内的trans数量,以便做出正确的操作,比如回滚或留下它。

1 个答案:

答案 0 :(得分:1)

我很好奇这个行为,我可以确认它是在SQL Server中观察到的。

  create table test (id int identity, t varchar(23))

  create trigger trg_inser on test after insert as
   select @@TRANCOUNT

   -- test 1
   insert into test(t) values ('test')
   --=> returns 1

  -- test 2
    begin transaction
    insert into test(t) values ('test')
    rollback
  --=> also returns 1

  select @@TRANCOUNT
  --=> returns 0

Books online记录了这种行为

  

触发操作就好像有未完成的交易一样   触发器执行时的效果。这是否属实   触发触发器的语句是隐式或显式的   事务。

     

当语句在自动提交模式下开始执行时,有一个   暗示BEGIN TRANSACTION允许恢复所有修改   如果遇到错误,则由语句生成。这意味着   事务对批处理中的其他语句没有影响,因为   它在语句完成时提交或回滚。   但是,当触发时,此隐含事务仍然有效   被称为。

我不认为您在触发器时能够区分事务是显式的还是隐式的。

我怀疑你可能需要做的是某种尝试...在触发器代码中捕获,处理触发器期间引发的错误