Sql server SQL Server大型事务锁定所有表

Sql server SQL Server大型事务锁定所有表,sql-server,transactions,locking,isolation,Sql Server,Transactions,Locking,Isolation,感谢您抽出时间阅读我的问题。我们已经使用T-SQL构建了一个处理(大量)数据的系统。当我们开始处理这些数据时,这个操作通常需要大约15分钟才能完成。在此期间,出于某种原因,数据库中的所有对象似乎都被锁定。在某种程度上,我知道我无法查询正在写入的表。但是,例如,当我刷新表列表时,SQL Server也会给我一条超时锁定消息(在对象资源管理器的“表”节点上使用F5) 我的代码基于以下模板工作: CREATE PROCEDURE Sample as SET NOCOUNT, XACT_ABORT

感谢您抽出时间阅读我的问题。我们已经使用T-SQL构建了一个处理(大量)数据的系统。当我们开始处理这些数据时,这个操作通常需要大约15分钟才能完成。在此期间,出于某种原因,数据库中的所有对象似乎都被锁定。在某种程度上,我知道我无法查询正在写入的表。但是,例如,当我刷新表列表时,SQL Server也会给我一条超时锁定消息(在对象资源管理器的“表”节点上使用F5)

我的代码基于以下模板工作:

CREATE PROCEDURE Sample

as

SET NOCOUNT, XACT_ABORT ON

BEGIN TRY

BEGIN TRANSACTION

...

COMMIT TRANSACTION

END TRY

BEGIN CATCH
    BEGIN
        PRINT 'STORED PROCEDURE - Returned errors while processing'
        ROLLBACK TRANSACTION
    END
END CATCH
现在,当我开始此操作时,我可以对任何表执行SELECT WITH(NOLOCK)查询。但我不能查看视图、存储过程的定义,也不能在数据库中执行任何其他类型的操作

我已经设置了readuncommitted隔离级别设置,但这似乎没有什么区别

谢谢你在这件事上的帮助


非常感谢,

TRY-CATCH块中的代码执行大量数据更新。更改隔离级别不会解决锁定问题

最适合您的是执行以下基本检查/更改:

  • 尝试将更新/插入分成更小的批;事情会进展得更顺利,从而显著减少锁定
  • 检查参与更新查询的表的索引,以便更快地返回数据
TRY-CATCH块中的代码执行大量数据更新。更改隔离级别不会解决锁定问题

最适合您的是执行以下基本检查/更改:

  • 尝试将更新/插入分成更小的批;事情会进展得更顺利,从而显著减少锁定
  • 检查参与更新查询的表的索引,以便更快地返回数据
问题与隔离级别无关,而是独占性的问题

这是数据库级的锁的情况


避免升级执行较小的批处理事务…

这些问题与隔离级别无关,而是独占性的问题

这是数据库级的锁的情况


避免升级进行较小的批处理…

隔离级别会影响select语句的工作方式,这些不会影响DDL、DML..锁定、阻止是一个大主题,因此请搜索如何解决锁定阻止,并从那里开始隔离级别会影响select语句的工作方式,这些不会影响DDL、DML..锁定,封锁是一个大话题,所以请搜索如何解决封锁,并从那里开始