如何在我使用时锁定行

Rag*_*ock 6 sql-server-2008 sql-server locking

我希望能够锁定一行,选择它,增加它的值,然后释放锁定。(不锁定其他行,以便其他连接可以与表的其余部分一起使用)

我找到了这个

BEGIN TRAN SELECT * FROM tablename WITH (HOLDLOCK, ROWLOCK)
WHERE ID = 1
Run Code Online (Sandbox Code Playgroud)

我的问题是我做不到

UPDATE tablename
SET columnName = -1
WHERE ID = 2
Run Code Online (Sandbox Code Playgroud)

在我提交上一个事务之前,为什么行锁会锁定整个表?

编辑:

此代码是否保证在此更新命令期间不会更新所选行的数据?

UPDATE [tablename] WITH (ROWLOCK)
SET columnName = columnName + 5
WHERE ID = 1
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 6

根据您的编辑,所有写锁定独占。

没有其他进程可以读取正在写入的行,除非

  • 你一直很傻,正在使用 NOLOCK
  • 您有快照隔离,其中读取了最后提交的行

通常不需要在日常代码中添加锁定提示。

至于为什么你(显然)有一个表锁,这可能是由于 ID 上没有索引造成的。该表被锁定,因为必须查看所有行。