gpt4 book ai didi

sql-server - Select 可以阻止插入表吗?

转载 作者:行者123 更新时间:2023-12-03 08:52:41 27 4
gpt4 key购买 nike

如果我对表执行 SELECTS,表上的 SELECT 查询是否有可能阻止对同一个表的 INSERTS?

SELECT 将在行上获取共享锁,但它不应该影响插入,正确吗?

查询是一个 LIKE 子句 - 这会阻止插入吗?有潜力吗?

SELECT * FROM USERS WHERE Description LIKE '%HELLO%'

引用:我读了这个回复SQL Server SELECT statements causing blocking我很困惑这会如何阻止插入。

最佳答案

A SELECT will take a shared lock on the rows, but it shouldn't effect inserts correct?

不,这不准确。当您执行SELECT时,它可以获取页面甚至整个上的共享锁,您可以使用 paglocktablock 提示自行测试(当然您应该使用 repeatable readserialized来查看它们,因为一旦不再需要,已提交的读中的所有共享锁都会被释放)。

相同的情况可以这样建模:

if object_id('dbo.t') is not null drop table dbo.t;

select top 10000 cast(row_number() over(order by getdate()) as varchar(10)) as col
into dbo.t
from sys.columns c1
cross join sys.columns c2;

set transaction isolation level serializable;

begin tran
select *
from dbo.t
where col like '%0%';

select resource_type,
request_mode,
count(*) as cnt
from sys.dm_tran_locks
where request_session_id = @@spid
group by resource_type,
request_mode;

enter image description here

在这里您可以看到锁升级结果,我的查询希望每个语句有超过5000个,所以服务器只需要一个 >lock上的共享锁

现在,如果您尝试从另一个 session 在此表中插入任何行,您的 INSERT 将被阻止。

这是因为任何插入首先需要获取table上的IXpage上的IX,但是同一个表上的IX与同一个表上的S不兼容,所以会被阻塞。

这样您的选择可能会阻止您的插入

要查看服务器上到底发生了什么,您应该使用通过 session_id 过滤的 sys.dm_tran_locks

关于sql-server - Select 可以阻止插入表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com