Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server select语句上的sql行锁_Sql Server_Tsql_Locking_Pessimistic Locking - Fatal编程技术网

Sql server select语句上的sql行锁

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语句期间的行

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


谢谢

使用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