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)
根据您的编辑,所有写锁定独占。
没有其他进程可以读取正在写入的行,除非
通常不需要在日常代码中添加锁定提示。
至于为什么你(显然)有一个表锁,这可能是由于 ID 上没有索引造成的。该表被锁定,因为必须查看所有行。