触发器的事务问题
wolve 2003-10-21 01:48:20 我定义一个instead型的触发器,用来在删除主表时修改或删除其它子表中的相关引用,我对触发器还是很熟,有几个问题问大家?
1.触发器中如果不申明显式的事务,是不是触发器运行时会自动有事务产生,如
create Trigger testTri
on TestTab
Instead of Delete
as
--删除table1的对它的引用
Delete From table1 where table1Id in (select Table1Id from deleted)
begin
rollback--这句是不是回滚了一个隐式的事务
raiserror("failed",16,23)
return
end
删除table2中的对它的引用
delete From table2 where table2Id In (select Table1Id from deleted)
if @@error
begin
rollback--这句是不是回滚了一个隐式的事务
raiserror("failed",16,23)
return
end
--。。。其它的操作
--最后删除主表
Delete From testTab where table1Id in (select Table1Id from deleted)
2.如果上面在开始是加一句:BEGIN TRANSACTION,后面加一句COMMIT TRANSACTION效果与前面的是不是一样的?
3.我在外部的应用程序中已经开始为一个事务,然后在这个事务中执行delete TestTab的操作,触发器中的所产生的事务是不是将作为一个嵌套的事务存在?此时,如果操作失败,触发器中的rollback会使外部的事务也回滚,这里产生了一个问题,在外部应用程序中,我通过catch exception来回滚事务,此时触发器的raiserror("failed",16,23)这一句引发异常,但是整个事务也在触发器中被回滚
,外部应用程序再次调用rollback时又会产生错误,这个问题怎么解决?
4.如果删除操作在删除table1时就失败了,假设去掉raiserror("failed",16,23)这一句,外部程序得到的rowcount应该小于1,但是由于触发器的原因,我在外部应用程序中得到的rowcount为什么会不小于1呢,这又是什么原因,怎么解决?
谢谢大家。