当我们进入触发器并在进入触发器之前打开一个事务时,@@ TranCount显示1,与我们没有打开该事务时相同。 那么有没有办法找出在这种情况下是否有一个开放的包装器事务?
PS:我有一个触发此触发器的表。可以使用/不使用包装器事务在不同的位置操作此表。我需要知道触发器内的trans数量,以便做出正确的操作,比如回滚或留下它。
答案 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允许恢复所有修改 如果遇到错误,则由语句生成。这意味着 事务对批处理中的其他语句没有影响,因为 它在语句完成时提交或回滚。 但是,当触发时,此隐含事务仍然有效 被称为。
我不认为您在触发器时能够区分事务是显式的还是隐式的。
我怀疑你可能需要做的是某种尝试...在触发器代码中捕获,处理触发器期间引发的错误