我已经运行了这个 SQL,
create table temp
(
id int,
name varchar(10)
)
insert into temp values(1,'a');
然后我就跑
select 1 from temp where id = 1
一切都很好。
然后我运行一个未提交的插入,
SET NOCOUNT ON;
DECLARE @TranCount INT;
SET @TranCount = @@TRANCOUNT;
IF @TranCount = 0
BEGIN TRANSACTION
ELSE
SAVE TRANSACTION Insertorupdatedevicecatalog;
insert into temp values(2,'b')
然后我就跑
select 1 from temp where id = 1
但这一次没有返回任何内容。为什么我的整个表被锁定而不是仅第二行被锁定?
最佳答案
SQL Server 没有锁定整个表。我可以看到单个 row-id 被写入事务锁定。
由于没有索引,读者必须扫描整个表。
这意味着它被插入行上的 X 锁阻止。基本上,读取器等待其他事务来决定是否要实际提交该行或回滚。
session 51 已插入 id 2。 session 54 是被阻止的选择。这里没有页锁或表锁(除了这里不重要的意向锁)。
事实上,该表是一个堆(没有像平常一样的唯一 CI)会导致此处发生意外锁定。通过在 id 上创建唯一的 CI 即可解决此问题。
关于sql - 为什么我的整个表被锁定而不是行被锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20358938/