.net - sp 执行时阻止读取行

标签 .net sql sql-server transactions locking

我有许多 .NET 进程从 SQL Server 2008 DB 表中读取消息并一次处理一个消息。我实现了一个简单的 SP 来“锁定”任何一个进程正在读取的行,以避免任何两个进程处理同一行。

BEGIN TRAN

SELECT @status = status FROM t WHERE t.id = @id
IF @status = 'L'
BEGIN
    -- Already locked by another process. Skip this
    RETURN 0
END
ELSE
    UPDATE t SET status = 'L' WHERE id = @id
    RETURN 1
END

COMMIT

但是,这是有缺陷的:有时一行会被“锁定”并处理两次。我怀疑存在并发问题:两个进程在更新状态之前先读取状态。

我认为这可以通过以某种方式实现读取 block 来解决(即使事务 block 读取),但我不确定如何做到这一点。有人可以帮忙吗?

提前非常感谢

瑞恩

最佳答案

为什么不直接替换整个东西

UPDATE t SET status = 'L' WHERE id = @id and status <> 'L'
RETURN @@ROWCOUNT

这将避免 2 次表访问和保持锁打开时间超过必要的时间。

关于.net - sp 执行时阻止读取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3362769/

相关文章:

c# - 如何在 C# 中添加对程序集的引用?

mysql - 排除相同的值和特定的规则集查询

c# - 在 html 电子邮件中发送 DataTable 的内容,从 DataTable 生成 HTML 的首选方法是什么?

sql - Azure 逻辑应用 - 将 SQL 表发送到单个电子邮件 - 操作方法

sql - 这是什么样的代码?

mysql - 如何使用包含静态值的 SELECT INTO?

SQL 合并与目标不匹配与源不匹配

sql - ExecuteNonQuery 总是返回 -1,即使 SQL 语句是正确的

c# - 异常:未设置应用程序标识

c# - 确定处理器支持哪些指令