mssql2000 表触发器并发时产生死锁

gyj5240 2011-06-28 01:39:06
ALTER TRIGGER [dbo].[T_Update_Bgd]
ON [dbo].[T_AB] for update
AS
BEGIN
if update(BGD)
begin
update c set c.status='Y'
from inserted a,T_C c
where a.YB=c.YW
and isnull(a.BGD,'')<>''

update c set c.qptime=GETDATE()
from inserted a, dbo.T_AB c
where a.bgd=c.bgd
end
end

如何修改这个触发器能够更好的避免死锁?
当然了,可以在程序里一次性写好语句更新,这个不管,只是谈论Trigger
谢谢
...全文
122 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyj5240 2011-08-26
  • 打赏
  • 举报
回复
还是修改得了。。。
用触发器在并发系统里好像不是太好
fanzhouqi 2011-06-28
  • 打赏
  • 举报
回复
加大锁粒吧
SQL77 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gyj5240 的回复:]
因为这是两个独立的表,当表T_C处于某个状态时隔会有个程序把这条记录的部分信息写到T_AB 中。
当update T_AB 中的BGD栏位时再更新到T_C中的状态。。别的地方都没有用事务,而且两个表会并发。

是否先更新本身T_AB 再更新T_C会好点?
[/Quote]
你更新的时候两个都按相同的顺序写,不要交叉,BGD 是主键吗?
--小F-- 2011-06-28
  • 打赏
  • 举报
回复
UPDATE本身就是一个事务啊 所以检查下其他地方还有UPDATE没有?
gyj5240 2011-06-28
  • 打赏
  • 举报
回复
因为这是两个独立的表,当表T_C处于某个状态时隔会有个程序把这条记录的部分信息写到T_AB 中。
当update T_AB 中的BGD栏位时再更新到T_C中的状态。。别的地方都没有用事务,而且两个表会并发。

是否先更新本身T_AB 再更新T_C会好点?
SQL77 2011-06-28
  • 打赏
  • 举报
回复
ALTER TRIGGER [dbo].[T_Update_Bgd]
ON [dbo].[T_AB] for update
AS
BEGIN
if update(BGD)
begin
update c set c.status='Y'
from inserted a,T_C c
where a.YB=c.YW
and isnull(a.BGD,'')<>''

update c set c.qptime=GETDATE()
from inserted a, dbo.T_AB c
where a.bgd=c.bgd
end
end


死锁原因确定是这个吗??
其他地方更新时也先写T——C的再写T——A的,顺序一致

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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