触发器的事务问题

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呢,这又是什么原因,怎么解决?

谢谢大家。
...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dhammacakkhu 2004-02-24
  • 打赏
  • 举报
回复
mark
qdubit 2003-10-21
  • 打赏
  • 举报
回复
同意大力的说法。
pengdali 2003-10-21
  • 打赏
  • 举报
回复
外部应用程序来回滚?
@@trancount是返回当前连接的活动事务数

@@rowcount 是返回上一句的影响行数,回滚了也是的。
wolve 2003-10-21
  • 打赏
  • 举报
回复
谢谢 pengdali(大力 V3.0)。
第三个问题:由于我在不能得到@@trancount,是不是可以在触发器中不回滚事务,而通过外部应用程序来回滚,由于触发器的事务是一个嵌套的事务,它也应该一样被回滚吧。
第四个问题,我没说明白,我就是通过@@rowcount>0这句来判断是否操作了,但实际上在删除table1时就return了,什么操作也没做,@@rowcount也是1,为什么啊
pengdali 2003-10-21
  • 打赏
  • 举报
回复
1.触发器中如果不申明显式的事务,是不是触发器运行时会自动有事务产生,如


2.如果上面在开始是加一句:BEGIN TRANSACTION,后面加一句COMMIT TRANSACTION效果与前面的是不是一样的?
你一回滚是回滚所有的操作包括触发这个触发器的操作

3.我在外部的应用程序中已经开始为一个事务,然后在这个事务中执行delete TestTab的操作,触发器中的所产生的事务是不是将作为一个嵌套的事务存在?此时,如果操作失败,触发器中的rollback会使外部的事务也回滚,这里产生了一个问题,在外部应用程序中,我通过catch exception来回滚事务,此时触发器的raiserror("failed",16,23)这一句引发异常,但是整个事务也在触发器中被回滚
,外部应用程序再次调用rollback时又会产生错误,这个问题怎么解决?
是,你用
if @@trancount<>0 rollback tran

4.如果删除操作在删除table1时就失败了,假设去掉raiserror("failed",16,23)这一句,外部程序得到的rowcount应该小于1,但是由于触发器的原因,我在外部应用程序中得到的rowcount为什么会不小于1呢,这又是什么原因,怎么解决?
用 @@rowcount>0

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧