我有一个简单的表格,我创建并填充它:
查询成功完成。然后我尝试:
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。
COMMIT;
,可能是开启了事务。此外,您可以考虑设置 RCSI 模式。 - Lukasz Szozda