SQL Server:触发死锁

时间:2013-12-23 02:59:39

标签: sql sql-server triggers deadlock

有一个InventoryCategory表,我在该表中附加了以下触发器。触发器的主要目的是在有人更新或插入或删除ProcessQueue表中的记录时用InventoryCategory RowID更新InventoryCategory表,以便我知道哪些记录已更新最近我需要更新其他系统。

我有一个多线程C#应用程序更新InventoryCategory,这个触发器导致死锁。如果我用单线程运行它,我没有任何错误。

CREATE trigger [dbo].[tr_InventoryCategory_Queue]
On [dbo].[InventoryCategory]
After Insert, Update, Delete
as
   if @@ROWCOUNT = 0
      return

   -- inserted records need to be either inserted or deleted into the queue
   if exists(select 1 from inserted)
   begin
       -- update existing queue records
       update ProcessQueue
       set ParentTable = 'InventoryCategory', UpdatedTime = getdate()
       from inserted i
       join ProcessQueue p on i.Id = p.RowID 
       where exists (select * from ProcessQueue q
                     where q.RowID = p.RowID and q.ParentTable = 'InventoryCategory')
       and p.ParentTable = 'InventoryCategory'

       -- insert new queue records
       insert into ProcessQueue (ParentTable, RowID)
          select 
              'InventoryCategory', i.id
          from
               inserted i
          where 
               i.ID not in (select q.RowID from ProcessQueue q
                            where q.ParentTable = 'InventoryCategory')
    end

    -- deleted records need to be either inserted or updated into the queue
    if exists(select 1 from deleted)
    begin
        -- update existing queue records
        update ProcessQueue
        set ParentTable = 'InventoryCategory', UpdatedTime = getdate()
        from deleted d
        join ProcessQueue p on d.Id = p.RowID 
        where exists (select * from ProcessQueue q
                      where q.RowID = p.RowID and q.ParentTable = 'InventoryCategory')
        and p.ParentTable = 'InventoryCategory'

        -- insert new queue records
        insert into ProcessQueue (ParentTable, RowID)
           select 
              'InventoryCategory', d.Id
           from
              deleted d
           where 
              d.Id not in (select q.RowID from ProcessQueue q
                           where q.ParentTable = 'InventoryCategory')
     end

有什么建议吗?

提前致谢

0 个答案:

没有答案