sql - 为什么我的整个表被锁定而不是行被锁定?

标签 sql sql-server sql-server-2008-r2

我已经运行了这个 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 被写入事务锁定。

由于没有索引,读者必须扫描整个表。

enter image description here

这意味着它被插入行上的 X 锁阻止。基本上,读取器等待其他事务来决定是否要实际提交该行或回滚。

enter image description here session 51 已插入 id 2。 session 54 是被阻止的选择。这里没有页锁或表锁(除了这里不重要的意向锁)。

事实上,该表是一个堆(没有像平常一样的唯一 CI)会导致此处发生意外锁定。通过在 id 上创建唯一的 CI 即可解决此问题。

关于sql - 为什么我的整个表被锁定而不是行被锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20358938/

相关文章:

SQL Server - key 更新死锁

c# - SqlClient.SqlException : Invalid column name ClassNameId While fetching data from Fluent API 异常

mysql - 使用 select 插入 MYSQL 时添加数字

c# - 如何将 DbGeometry 对象解析为 List<T>?

c# - 从数据库表生成类

c# - Azure SQL 上的 Hangfire

performance - 优化大量插入性能...?

tsql - 哪里存在 - 所有 - 分组依据?

reporting-services - 如何让 SSRS 2008 R2 以 Excel 2007 格式导出/呈现?

c# - 从 sql 发送到手机的乌尔都语消息格式不可读