基本触发锁定问题

时间:2012-02-28 12:07:33

标签: sql sql-server-2008

我有一个关于触发器的问题。 场景就像这样

Create Procedure
begin
    Insert into XYZ (a) values (b)
end

现在我已将触发器放在XYZ台上的 INSERT - AFTER 上。 在该触发器中,存在业务逻辑,执行它需要2-3秒,业务逻辑针对其他数据库表不在XYZ表上执行

所以我需要在这里确认一旦INSERT完成,那么表XYZ将准备好插入另一个记录,否则它将被锁定直到触发完成?

修改

我已就此问题做了更多研究,并在下面解释 在INSERT - TRIGGER中,我已经将我的业务逻辑放在行下面

WAITFOR DELAY '00:01'

现在当我尝试执行上述SP时,SP没有完成1分钟(因为我在触发器中指定了1分钟的延迟),并且在此期间表XYZ也被锁定。

因此,这使我得出结论,即使您没有在触发器中使用相同的表,触发器也会锁定表。我对吗?有人在这里有不同意见吗?

1 个答案:

答案 0 :(得分:2)

@Hallainzil关联的问题和答案显示了一种方法:

  • 将所有表INSERT和UPDATE包装到存储过程
  • 然后,SP可以在不保持锁定的情况下完成额外的业务逻辑


还有另一种方法在几个方面略显混乱,但在许多方面也更灵活:

  • 记录哪些字段已被INSERTED或UPDATED
  • 让代理人工作重复或隔夜处理以处理这些更改

您可以使用触发器来保留该记录。可能使用LastModifiedTime字段,或hasBeenProcessed字段,甚至是单独的跟踪表。它可以通过多种方式完成,并且维护相对较轻(尚未发生任何业务逻辑)。

这会尽快从任何锁中释放您的表。这也意味着您可以处理能够直接写入您的表的登录,从而绕过您的存储过程。

缺点是您的INSERTS / UPDATES和业务逻辑正在异步处理。您的其他SQL代码可能需要检查业务逻辑是否已完成,而不是仅假设INSERT和业务逻辑始终以原子方式发生。


所以,是的,有办法避免这种锁定。但是,您为模型引入了额外的约束和/或复杂性。这绝不是一件坏事,但需要在整体设计中加以考虑。