SQL Server触发器?别让嵌套执行坑哭你!
|
SQL Server触发器?别让嵌套执行坑哭你!我原以为嵌套触发器最多三层就到头,结果现场给我来个五层套娃,连底层的触发顺序都乱成一团,到最后查日志连哪条语句触发了哪次回调都捋不清。 机房的服务器在嗡嗡响,耳朵里全是那种低频的震动感,桌上的外卖盒渗着油,我用指尖碰了碰盒边,油蹭在指腹上黏糊糊的,刚擦了两下,旁边小周凑过来,手里转着一支半红笔帽的笔,说要去补打上个月的备份,我头都没抬就说别去,现在没人腾得开手。 刚接手这个项目,之前的人只写了个大概的触发器,说“不会有嵌套”,我当时也没细查,就把核心逻辑塞进去了。前天上了新的业务接口,刚测了三笔,系统直接报锁超时,连带着三个表都卡了。我喊小周查,他翻了十分钟,说“没见锁表记录”,我抢过他的键盘,刚要改查询语句,他突然说“我去接个电话,你先弄”,转身就溜了。 我拽过鼠标往上翻,触发器里居然套了三个,还有个更新语句里嵌了另一个插入触发器,连递归深度都没设限制,我试着重置递归深度,设成三层,结果刚跑了两笔,又触发了额外的两次回调,直接把表锁死了。我盯着屏幕上的错误码,骂了句“这不是坑人吗”,小周在旁边喊“外卖到了”,我没理他,继续翻之前的触发器代码。 这个我敢打包票,之前踩过触发器嵌套的小坑,知道不能随便开递归,可这次的坑比上次深多了。我原以为只要把递归层数限死就没事,结果底层的触发器还藏着更新别的表,另一个表又有自己的触发器,全串起来了,到最后连哪条语句先跑的都分不清。 窗外突然下起雨,雨点击打着机房的窗户,噼噼啪啪的响,我盯着屏幕上的锁超时提示,手指在键盘上悬着,不知道该改哪。小周从外面进来,手里拿着外卖,递了一根炸鸡腿给我,我没接,他自己咬了一口,说“这鸡腿挺嫩的”,我没应声,继续看触发器的嵌套层级。 我查了三次日志,才捋清楚触发顺序,第一层是用户表的插入,第二层触发了订单表的更新,第三层触发了库存表的扣减,第四层触发了日志表的插入,第五层又绕回了用户表,连递归深度翻了倍都没停下。我把递归层数改成二层,结果刚跑了一笔,订单表就锁死了,我咬了咬牙,把所有嵌套触发器都关了,系统才恢复正常,可业务日志里已经多了三条错误记录。 这个我说不准,之前只在测试环境玩过单触发器,没在生产环境碰过这么复杂的嵌套,这次算是长见识了。小周在旁边啃着外卖,说“早知道你会搞砸,我就不接电话了”,我没理他,继续翻之前的触发器代码,看能不能把嵌套的逻辑拆出来。 我把订单表的更新逻辑从触发器里移到存储过程里,把递归深度设成一层,然后跑了五笔测试数据,系统没再锁表,可日志里还是多了两次重复的插入。我盯着屏幕上的重复记录,叹了口气,小周递了一杯热豆浆给我,说“喝口吧,凉了不好”,我接过来,指尖碰到杯子的温度,暖了点。 我原以为改完存储过程就没事了,结果日志里的重复插入还在,最后查出来是日志表的触发器没关,我把日志表的触发器也关了,重复插入才停了。这个我敢打包票,触发器的嵌套真的是个大坑,别不信邪,一不留神就把自己坑死。
文章配图,仅供参考 雨停了,窗外的空气有点潮,机房的噪音好像也小了点,小周把外卖盒收拾了,说要去补打备份,我没拦他,继续看刚改完的代码,心里想着下次再写触发器,一定要把嵌套层数限死,还要把所有相关的触发器都查一遍,别再踩这种坑了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


6年老炮揭秘:存储过程嵌套3层,触发器坑哭新手
内行透底:存储过程嵌套3层,触发器死锁怎么破?
SQL Server存储过程与触发器实战:构建高可用数据审计系统