Sql 如果没有锁被取出,为什么查询会被阻塞?
我昨天一整天都在查询。每次运行大约需要2小时。没有问题。我正在监视取出的锁,并检查阻塞的进程。有一个进程必须每15分钟运行一次,所以我通过检查一个表的内容,然后等待它变空来说明这一点,当它完成时,进程将清空它。然后我的问题继续 当我离开的时候,我再次打开了这个查询,今天早上我来看了一些邮件,这些邮件在我离开5分钟后就被屏蔽了 sp_who2显示我的进程当前在'WAITFOR'命令中,我的查询输出显示了相同的内容。当时没有锁。但它仍在阻碍其他进程 如果没有取出锁,为什么进程会阻塞?如果没有执行插入,为什么进程会阻塞?WAITFOR位于while循环的顶部。再一次,我一整天都在运行,没有任何问题。它等待过程像它应该的那样结束,然后继续Sql 如果没有锁被取出,为什么查询会被阻塞?,sql,sql-server-2008,Sql,Sql Server 2008,我昨天一整天都在查询。每次运行大约需要2小时。没有问题。我正在监视取出的锁,并检查阻塞的进程。有一个进程必须每15分钟运行一次,所以我通过检查一个表的内容,然后等待它变空来说明这一点,当它完成时,进程将清空它。然后我的问题继续 当我离开的时候,我再次打开了这个查询,今天早上我来看了一些邮件,这些邮件在我离开5分钟后就被屏蔽了 sp_who2显示我的进程当前在'WAITFOR'命令中,我的查询输出显示了相同的内容。当时没有锁。但它仍在阻碍其他进程 如果没有取出锁,为什么进程会阻塞?如果没有执行插入
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
declare @start bigint
declare @end bigint
declare @max bigint
declare @step int
set @step = 49999
set @start = 120790808
set @end = @start + @step
set @max = @start + 50000000
while ( @end < @max )
begin
while (select COUNT(*) from SomeOtherTable (nolock)) > 0
begin
print 'Waiting for process'
waitfor delay '00:00:30'
end
begin transaction
update [TableA] with (tablock)
set [TableA].[ColumnA] = [TableB].[ColumnA]
from [TableB] (nolock)
where [TableB].[ColumnB] = [TableA].[ColumnB]
and [TableA].ID >= @start
and [TableA].ID < @end
commit transaction
print @end
if @end >= @max
begin
break
end
set @start = @end
set @end = @end + @step
end
是的,就像@IlovePaperTowers所说的那样,用tablock更新[TableA]意味着一个表级锁。它覆盖了您的隔离级别在一个查询中,比如一个包含显式事务但没有错误捕获的已发布查询,很可能有一个事务处于打开状态
如果执行BEGIN TRAN,但您从未提交或回滚,则事务将无限期保持打开状态,这可能会导致各种难以跟踪的阻塞问题。它阻塞了什么?另一个进程上可能存在非常高的隔离级别。NoLock不是完全无锁的,它仍然会发出Sch-s锁,在该窗口期间是否有任何东西试图修改表架构?就是这样,它阻止了一个进程,该进程在我监视时运行了一整天,没有任何问题。然而,它也阻止了一个工作步骤。我正在等待另一个开发人员加入,这样我才能知道它的功能。@Andrew,不,我从中选择的内容没有被修改。表B没有被任何东西使用。虽然是TableA,但使用tablock进行分块时速度非常快,不会造成任何阻塞。。。至少有一个进程被阻塞了很长时间。@i我看纸巾有可能进程启动后就停止了吗?我这样问是因为如果您有一个BEGIN事务,但没有回滚或提交,那么它也可以锁定一个表。sp_who2显示进程位于“WAITFOR”而不是“INSERT”。WAITFOR进程在阻塞列中有一个非零值。找那个钉子。如果不是您的update语句,我会感到惊讶。我相信,当我停止执行时,它没有执行commit,而是打开了保存tablock的事务。考虑到时间和证据,这是最有意义的。