Sql server select语句上的sql行锁
我有一个ASP.Net网页,用户在其中选择一行进行编辑。我想在该行上使用行锁,一旦用户完成编辑和更新,另一个用户可以编辑该行,即,我如何使用行锁,以便只有一个用户可以编辑一行Sql server select语句上的sql行锁,sql-server,tsql,locking,pessimistic-locking,Sql Server,Tsql,Locking,Pessimistic Locking,我有一个ASP.Net网页,用户在其中选择一行进行编辑。我想在该行上使用行锁,一旦用户完成编辑和更新,另一个用户可以编辑该行,即,我如何使用行锁,以便只有一个用户可以编辑一行 谢谢使用DB引擎锁无法锁定这样的行 大多数其他策略都依赖于保持连接打开(如sp_getapplock),这在web应用程序中是毫无意义的 即使在行上设置了一个标志,如果用户只是在编辑过程中关闭浏览器,会发生什么 我建议在其他会话中使用timestamp/rowversion列来检测行的更改。这里我给select语句期间的行
谢谢使用DB引擎锁无法锁定这样的行 大多数其他策略都依赖于保持连接打开(如sp_getapplock),这在web应用程序中是毫无意义的 即使在行上设置了一个标志,如果用户只是在编辑过程中关闭浏览器,会发生什么
我建议在其他会话中使用timestamp/rowversion列来检测行的更改。这里我给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会主动升级为页锁,要么服务器内存中会出现大量行锁,导致处理陷入停滞
另一个
另一个很好的链接,我想与你分享锁<代码>https://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/
谢谢+1绝对-不要陷入“自己锁定”的困境-这不值得麻烦…谢谢,我将使用时间戳方法。+1,我这样做,当您加载页面数据时,获取上次更改的完整日期时间。当您在更新中保存数据include
和LastChangeDate=….
时,如果rowcount=0,则我会发出一条错误消息,说明其他人已经更改了该数据。+1用于回答我来这里查找的问题,但它没有回答OP的问题。您不能打开事务,允许用户在网页上输入,然后提交事务。整个事务必须是对服务器的一次调用。
SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1