我试图了解 SQL Server 中的 ROWLOCK 以在锁定记录后更新记录。这是我的观察,并想确认 ROWLOCK 是否像表或页面锁之类的东西,或者我没有正确尝试。ROWLOCK 应该是对行的锁定,而不是对表或页面的锁定。
这是我尝试过的:
我创建了一个简单的表:row_lock_temp_test
有两列ID和Name,没有 PK 或索引。现在我打开 SQL Server,两个不同的客户端但相同的凭据并尝试执行一组查询,如下所示:
客户 1:
1: BEGIN TRANSACTION;
2: update row_lock_temp_test set name = 'CC' where id = 2
3: COMMIT
客户 2:
1: BEGIN TRANSACTION;
2: update row_lock_temp_test set name= 'CC' where id = 2
3: COMMIT
我在 C-1 上执行了查询 1、2,然后转到 C-2 并执行相同的查询,两个客户端都执行了查询,然后我提交了事务,一切都很好。
然后我添加了 RowLock 来更新查询,
C-1
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 2
3: COMMIT
C-2
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 2
3: COMMIT
现在,我在 C-1 上执行了查询 1 和 2,然后转到 C-2 并尝试执行相同的 2 个查询,但是由于该行被 C-1 锁定,所以它应该在队列中,直到事务在 C-1 上提交。一旦我在 C-1 上提交了事务,对 C-2 的查询就被执行了,然后我也在 C-2 上提交了事务。都好。
在这里,我尝试了另一种场景来执行同一组查询,其中行 id = 3
C-2
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 3
3: COMMIT
我在 C-1 中执行了第一个两个查询,然后执行了 C-2 的第一个两个查询,两个客户端的行 ID 不同,但是 C-2 中的查询仍然卡住了。这意味着在使用 id = 2 更新查询时,它已锁定页面或表,我期待行锁定,但它似乎是页面或表锁定。
我还尝试使用 xlock、HOLDLOCK 和 UPDLOCK 和不同的组合,但它总是锁定表。有没有可能只锁定一行。
选择和插入按预期工作。
提前致谢。