在存储过程中释放第一个 table 上的锁

Release lock on first table during stored procedure

我有一个看似简单的问题,但找不到解决方案。我有一个长 运行 存储过程,它将在语句的开头和结尾更新 table。问题是, table 在整个过程中都被锁定了。这是一个简化版本:

ALTER PROCEDURE [dbo].[Proc_FullRefresh]
AS
BEGIN
    UPDATE Settings SET SettingValue = 'true' WHERE SettingName = 'Running' 

    WAITFOR DELAY '00:00:30'
END

问题是,我无法 select 来自 Settings table 的那一行,而整个过程是 运行。我什至尝试包装交易以查看是否有帮助:

BEGIN TRAN
UPDATE Settings SET SettingValue = 'true' WHERE SettingName = 'Running' 
COMMIT;

BEGIN TRAN
WAITFOR DELAY '00:00:30'
COMMIT

但这也没有用。有什么方法可以在程序执行其他操作时释放 Settings table 上的锁?

Is there any way to release the lock on the Settings table while the procedure is doing its other stuff?

您正在 运行在事务中使用存储过程,否则 UPDATE 语句将立即完成,并且对其他会话可见。当您添加额外的 BEGIN TRAN/COMMIT 对时,您实际上是在创建一个 "nested transaction" 来自 UPDATE 的锁将被持有,直到外部(实际)事务提交。

所以不要运行事务中的过程。

一些客户端和数据 access/ORM 框架会自动启动事务,但大多数需要您明确启动事务。