我有一个关于触发器的问题。 场景就像这样
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也被锁定。
因此,这使我得出结论,即使您没有在触发器中使用相同的表,触发器也会锁定表。我对吗?有人在这里有不同意见吗?
答案 0 :(得分:2)
@Hallainzil关联的问题和答案显示了一种方法:
还有另一种方法在几个方面略显混乱,但在许多方面也更灵活:
您可以使用触发器来保留该记录。可能使用LastModifiedTime字段,或hasBeenProcessed字段,甚至是单独的跟踪表。它可以通过多种方式完成,并且维护相对较轻(尚未发生任何业务逻辑)。
这会尽快从任何锁中释放您的表。这也意味着您可以处理能够直接写入您的表的登录,从而绕过您的存储过程。
缺点是您的INSERTS / UPDATES和业务逻辑正在异步处理。您的其他SQL代码可能需要检查业务逻辑是否已完成,而不是仅假设INSERT和业务逻辑始终以原子方式发生。
所以,是的,有办法避免这种锁定。但是,您为模型引入了额外的约束和/或复杂性。这绝不是一件坏事,但需要在整体设计中加以考虑。