触发器及事务

  写在文章之前,希望使用触发器的同仁慎之又慎;触发器提供的便利自不用说,但是它的弊端会在日后慢慢显现,是难以及时察觉的。在两年的使用中,多次因触发器引发应用系统故障。这种故障很难察觉,通过sqlsever的跟踪器也无法抓到错误代码。有时候你抓到一段简单的插入语句,cpu耗时少,读取和写入的数据量很小,也没发现任何阻塞但是这个插入就是耗时很长;有时候是很简单的业务逻辑的实现,软件代码很简单看不出来任何,可是功能就是达不到预期;还有时候就是需求变更了,修改软件模块,怎么也找不到某一块业务逻辑的数据实现;对,都是触发器这个始作俑者在搞鬼;

  读者能在软件中实现的尽量不要用触发器。实在要使用触发器,尽量缩小触发器的作用范围,比如用update(),仅是更新某一字段时触发;

1.触发器与事务的关系

 触发器可以被认为是一个隐式的嵌套事务。嵌套在引发它的事务中。

 2.触发器与约束的关系。见下图。

   after 触发器先验证约束,然后激活触发器。

   instead  of 触发器刚好相反。


 

 

 

 

 

 

 

 

 

 

 

3.触发器中的回滚操作

 a、显示的回滚,将撤销从最外层的begin tran开始的所有操作。

    b、隐式的回滚,将撤销触发器内rollback以前的所有操作,并撤销触发语句。

    c.可以通过save tran创建保存点,回退部分操作。或者在触发器中提前commit事务。

 

  由于隐式的包含事务,在触发器中出现rollback或者commit后,需要在写一个begin tran.具体见图:

  

    d.特别注意:触发器中的回滚操作之后的语句将被继续执行,然后触发语句所在的批处理之后的语句将被终止执行。

4.触发器嵌套及递归

   a.服务器默认开启触发器嵌套。且最高嵌套32层。超过限制后回滚所有的操作。

  相关选项:nested triggers

   b.服务器默认不开启触发器递归。

  相关选项:recursive_triggers

 

posted on   sxfinfo  阅读(500)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示