请各位大侠,帮忙看一下下面触发器Before Insert 语句是否会引起死锁问题?

jack15850798154 2017-10-24 11:57:49

BEGIN
IF NEW.PriceType=1 && New.ItemId is not null Then
SELECT ItemType,Status INTO @ItemType,@ItemStatus FROM TtProposalXItems WHERE ItemId=New.ItemId;
IF @ItemType=5 or @ItemType=7 Then
IF NEW.ExpenseData IS NULL OR NEW.ExpenseData='' OR NEW.ExpenseData='{}' OR NEW.ExpenseData='null'
THEN
SET NEW.ExpenseData=JSON_COMPACT(JSON_OBJECT('payProgress','00'));
ELSE
SET NEW.ExpenseData=JSON_COMPACT(JSON_SET(NEW.ExpenseData,'$.payProgress','00'));
END IF;
SET NEW.ExpenseData=Json_compact(New.ExpenseData);
SELECT Code into @Code FROM FnTenants WHERE TenantId=NEW.TenantId;
IF(@Code='XXXXX')
THEN
SET @isNeedUploadInvoice='true';
ELSE
SELECT JSON_VALUE(ExtData,'$.isNeedUploadInvoice') into @isNeedUploadInvoice
FROM FnDictionaryValView
WHERE KeyCode='CPC-City' AND Val=(SELECT CityDictVal
FROM TtProposals WHERE ProposalId=New.ProposalId);
END IF;
IF NEW.PayStatus=0 THEN
SET NEW.ExpenseData=Json_replace(New.ExpenseData,'$.payProgress','00');
ELSEIF NEW.PayStatus=10 AND @isNeedUploadInvoice='true' THEN
SET NEW.ExpenseData=Json_replace(New.ExpenseData,'$.payProgress','06');
ELSEIF NEW.PayStatus=20 AND @isNeedUploadInvoice='true' THEN
SET NEW.ExpenseData=Json_replace(New.ExpenseData,'$.payProgress','06');
ELSEIF NEW.PayStatus=30 AND @isNeedUploadInvoice='true' THEN
SET NEW.ExpenseData=Json_replace(NEW.ExpenseData,'$.payProgress','06');
ELSEIF NEW.PayStatus=40 AND @isNeedUploadInvoice='true' THEN
SET NEW.ExpenseData=Json_replace(New.ExpenseData,'$.payProgress','06');
Else
SET New.ExpenseData=Json_replace(New.ExpenseData,'$.payProgress','10');
End IF;
IF @ItemStatus=5 Then
SET New.ExpenseData=Json_replace(New.ExpenseData,'$.payProgress','10');
End IF;
End IF;
End IF;
END
...全文
163 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2017-10-30
  • 打赏
  • 举报
回复
不建议在数据库加触发器 并且还是这么复杂逻辑的触发器
LongRui888 2017-10-30
  • 打赏
  • 举报
回复
这种需求,最好让程序实现,我看你代码里还要处理json。。。
LongRui888 2017-10-30
  • 打赏
  • 举报
回复
尽量不要用触发器,特别是for row的那种触发器,很影响性能
kampoo 2017-10-29
  • 打赏
  • 举报
回复
SQL程序的代码写的很清晰 代码中访问了多个表和视图:TtProposalXItems、FnTenants、FnDictionaryValView,如果这个Before INSERT触发器在的表跟上述表和视图不同,不会出现死锁。如果视图跟触发器在的表相关,只要视图是手工更新的视图(不是动态视图),死锁问题也不会出现。

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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