select语句中的sql rowlock

时间:2010-04-20 09:43:31

标签: sql-server tsql locking pessimistic-locking

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

谢谢

2 个答案:

答案 0 :(得分:4)

使用数据库引擎锁无法锁定行。

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

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

我建议使用timestamp / rowversion列来检测其他会话中对行的更改。

答案 1 :(得分:4)

这里我在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

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

请注意,如果有大量行受到影响,SQL Server将主动升级为页锁,或者您将拥有一大堆行锁来填充服务器的内存并阻碍处理。

另一个

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 

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

感谢