SQL Server 插入 VARBINARY 数据类型,导致表被锁定 30 分钟以上。

3
我有一个简单的表格,我创建并填充它:
USE MyDB
GO

CREATE TABLE dbo.mytable (
    my_id INTEGER IDENTITY(1,1) NOT NULL,
    description VARCHAR(MAX) NOT NULL,
    image VARBINARY(MAX) NOT NULL
);

INSERT INTO dbo.mytable (
    description, image
)
SELECT
    'foo',
    CAST('bar' AS VARBINARY(MAX));

查询成功完成。然后我尝试:
SELECT * -- Or SELECT COUNT(*)
FROM MyDB.dbo.mytable;

并等待永远...

运行这里找到的查询,我看到5个排他锁(3个X、2个IX)在大约30分钟内没有被释放。一旦锁被释放,SELECT查询几乎瞬间完成。

为什么这些锁会保持这么长时间? 我该怎么做才能减少INSERT和SELECT之间的时间?

*注意,上面示例中的INSERT是在尝试插入一个应用程序中的图像后进行的手动测试,因为该行为与此相同。使用的图像大小约为14.2kB。


1
尝试添加 COMMIT;,可能是开启了事务。此外,您可以考虑设置 RCSI 模式。 - Lukasz Szozda
事务是隐式的吗?还是说它们是惰性提交的?所有其他查询似乎都会立即提交。 - That1Guy
1
每个插入操作都在事务范围内执行。这是ACID原则的一部分。这意味着没有显式事务的插入将在隐式事务下运行。它们不会懒惰地提交。它们要么立即提交,要么立即回滚。 - Sean Lange
@SeanLange 很有趣 - 我之前不知道这个。但我仍然感到困惑。这意味着插入本身(或回滚)负责保持锁定状态。我不明白为什么像这样简单的插入操作会花费如此长的时间(现在已经超过一个小时了)。 - That1Guy
2
运行此处找到的查询,我看到有5个独占锁(3个X,2个IX)未在约30分钟内释放。那么持有这些锁的SPID是什么? - sepupic
显示剩余2条评论
1个回答

1

看起来你有一个打开的事务(可能是隐式的)。我建议在INSERT之后添加COMMIT

INSERT INTO dbo.mytable (description, image)
SELECT 'foo',
        CAST('bar' AS VARBINARY(MAX));

COMMIT;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接