Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果没有锁被取出,为什么查询会被阻塞?_Sql_Sql Server 2008 - Fatal编程技术网

Sql 如果没有锁被取出,为什么查询会被阻塞?

Sql 如果没有锁被取出,为什么查询会被阻塞?,sql,sql-server-2008,Sql,Sql Server 2008,我昨天一整天都在查询。每次运行大约需要2小时。没有问题。我正在监视取出的锁,并检查阻塞的进程。有一个进程必须每15分钟运行一次,所以我通过检查一个表的内容,然后等待它变空来说明这一点,当它完成时,进程将清空它。然后我的问题继续 当我离开的时候,我再次打开了这个查询,今天早上我来看了一些邮件,这些邮件在我离开5分钟后就被屏蔽了 sp_who2显示我的进程当前在'WAITFOR'命令中,我的查询输出显示了相同的内容。当时没有锁。但它仍在阻碍其他进程 如果没有取出锁,为什么进程会阻塞?如果没有执行插入

我昨天一整天都在查询。每次运行大约需要2小时。没有问题。我正在监视取出的锁,并检查阻塞的进程。有一个进程必须每15分钟运行一次,所以我通过检查一个表的内容,然后等待它变空来说明这一点,当它完成时,进程将清空它。然后我的问题继续

当我离开的时候,我再次打开了这个查询,今天早上我来看了一些邮件,这些邮件在我离开5分钟后就被屏蔽了

sp_who2显示我的进程当前在'WAITFOR'命令中,我的查询输出显示了相同的内容。当时没有锁。但它仍在阻碍其他进程

如果没有取出锁,为什么进程会阻塞?如果没有执行插入,为什么进程会阻塞?WAITFOR位于while循环的顶部。再一次,我一整天都在运行,没有任何问题。它等待过程像它应该的那样结束,然后继续

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的事务。考虑到时间和证据,这是最有意义的。