select语句中的sql rowlock

Dav*_*vid 5 t-sql sql-server locking pessimistic-locking

我有一个ASP.Net网页,用户选择一行进行编辑.我想在该行上使用行锁,一旦用户完成编辑和更新,另一个用户就可以编辑该行,即如何使用rowlock以便只有一个用户可以编辑一行?

谢谢

gbn*_*gbn 5

您不能使用数据库引擎锁来锁定这样的行。

大多数其他策略将依赖于保持连接打开(例如 sp_getapplock),这在 Web 应用程序中是荒谬的。

即使你在行上设置了一个标志,如果用户只是在编辑中关闭浏览器会发生什么?

我建议使用时间戳/行版本列来检测其他会话中行的更改。


Mou*_*Mou 5

在这里,我在 select 语句期间提供了两组 sql 来行锁。

BEGIN TRAN

SELECT *
FROM   authors AU
WITH   (HOLDLOCK, ROWLOCK)
WHERE  AU.au_id = '274-80-9391'

/* Do all your stuff here while the row is locked */

COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

HOLDLOCK提示礼貌地要求 SQL Server 保持锁定,直到您提交事务。该ROWLOCK提示礼貌地要求 SQL Server 仅锁定该行,而不是发出页或表锁定。

请注意,如果大量行受到影响,要么 SQL Server 将采取主动并升级为页锁,要么您将有一大群行锁填满您的服务器的内存并使处理陷入困境。

另一个

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 
Run Code Online (Sandbox Code Playgroud)

我想与您分享锁定的另一个好链接。 https://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/

谢谢