sql - 基本触发锁定问题

标签 sql sql-server-2008 triggers

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

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 也被锁定。

因此,这使我得出这样的结论:即使您没有在触发器中使用同一个表,触发器也会锁定表。我对吗?大家有不同意见吗?

最佳答案

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

  • 将所有表 INSERT 和 UPDATE 包装到存储过程中
  • SP 随后可以完成额外的业务逻辑,而无需维护锁定


还有另一种方法,它在几个方面稍微困惑一些,但在很多方面也更灵活:

  • 记录已插入或更新的字段
  • 反复或通宵解雇代理职位来处理这些更改

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

这会尽快释放您的表的所有锁定。这还意味着您能够处理能够直接写入表的登录,从而绕过存储过程。

缺点是您的插入/更新和业务逻辑是异步处理的。您的其他 SQL 代码可能需要检查业务逻辑是否已完成,而不是仅仅假设 INSERT 和业务逻辑总是自动发生。


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

关于sql - 基本触发锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481611/

相关文章:

asp.net - Oracle:如何参数化列表?

MySQL JOIN "WHEN"- 这样的事情可能吗?

sql - 确定 SQL 中事件的日期顺序(针对每个组)

mysql - 我应该害怕还是拥抱数据库触发器?

triggers - 如何在 SQL Server 2008 R2 表中添加 "last updated"列?

mysql - 选择任何一个重复值的 ID 以仅从表中获取唯一列

mysql - 加入时间戳范围

sql-server-2008 - 从 SQL Server 2008 的 .mdf 和 .ldf 文件恢复数据库

sql - 部署 SQL Server 数据库的最佳版本无关方法是什么?

mysql - 从哪里开始更新 PostgreSQL 触发器?