尝试查看数据库层次结构时出现“超出锁定请求超时期限”错误

Llo*_*nks 26 sql-server-2008 sql-server

我在使用数据库时遇到问题。

  1. 我可以运行基本查询,尽管比正常情况慢得多。

  2. 当我尝试在 SSMS 对象资源管理器中查看表、视图或过程的层次结构树时,我得到lock request time out period exceeded.

  3. 我在此数据库中的对象上运行的 SSRS 报告不再完成。

  4. 与存储在此数据库中的过程相关的作业也不会运行。

我尝试使用sp_who2查找并终止数据库上的所有连接,但这并没有解决问题。

这里发生了什么?我该如何解决这个问题?

Llo*_*nks 20

它是由事务的永久回滚引起的。最终不得不重新启动我的服务器集群

  • 重新启动服务为我解决了它。 (2认同)

Jul*_*bre 7

正如许多人已经指出的那样,通常会有一个持久的事务,主要是由未使用造成的SET IMPLICIT TRANSACTIONS ON,根本不应该使用它。要了解原因,请查看Brent Ozar 的富有洞察力的文章

无论如何,您可以使用以下查询获取长期待处理事务的列表。

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
where [s_tdt].[database_transaction_begin_time] is not null
ORDER BY
    [Begin Time] ASC;
Run Code Online (Sandbox Code Playgroud)

https://www.brentosar.com/archive/2018/02/set-implicit_transactions-one-hell-bad-idea/


小智 6

排除硬件考虑,也许您需要运行脚本来检查哪些活动扣留了 SQL 会话,其中一种常见的情况是Implicit transactions Option在 SQL Server Management Studio 中不使用。


Bao*_*dad 6

当我开始一个显式事务时,我遇到了这个问题,在该事务中,我从另一个数据库(不是 tempdb)中运行的脚本在 tempdb 中创建了一个表。当我提交事务时,提交似乎没有释放我在 tempdb 中创建的表上的锁。

多亏了这个页面,我USEd tempdb 并执行DBCC OPENTRAN并获得了导致锁定的 tempdb 连接的 SPID。那我KILL <SPID number>就杀了它。

不是很优雅,我丢失了在 tempdb 中创建的表中的所有信息,但在我的情况下还可以。