我的数据库有问题。
我可以运行基本查询,尽管比正常情况要慢得多。
当我尝试在SSMS Object Explorer中查看表,视图或过程的层次结构树时,得到
lock request time out period exceeded
。我在此数据库中的对象上运行的SSRS报告不再完成。
与该数据库上存储的过程关联的作业也不会运行。
我尝试使用 sp_who2
查找并杀死数据库上的所有连接,但是这并没有解决问题。
这里发生了什么?我该如何解决?
我的数据库有问题。
我可以运行基本查询,尽管比正常情况要慢得多。
当我尝试在SSMS Object Explorer中查看表,视图或过程的层次结构树时,得到lock request time out period exceeded
。
我在此数据库中的对象上运行的SSRS报告不再完成。
与该数据库上存储的过程关联的作业也不会运行。
我尝试使用 sp_who2
查找并杀死数据库上的所有连接,但是这并没有解决问题。
这里发生了什么?我该如何解决?
Answers:
这是由于交易的永久回滚所致。不得不最终重启我的服务器集群
除Harware考虑外,也许您需要运行脚本以检查哪些活动扣留了SQL Session,一种常见的情况是不在Implicit transactions Option
SQL Server Management Studio中使用。
locking request time out period exceed
我会说跑步implicit transaction option
会更好地找出原因。
当我开始显式事务时,我从另一个数据库(而不是tempdb)中运行的脚本在tempdb中创建表时遇到了这个问题。当我提交事务时,提交似乎并没有释放我在tempdb中创建的表上的锁。
感谢此页面,我对USE
tempdb进行了执行DBCC OPENTRAN
并得到了导致锁定的tempdb连接的SPID。然后我KILL <SPID number>
要杀死它。
不太优雅,我丢失了在tempdb中创建的表中的所有信息,但就我而言,这还可以。
这可能有太多的事情,我只能提供一些问题来帮助您找到答案。
服务器上的DB是否专用于仅运行SQL Server?否则,其他进程可能会因为浪费宝贵的处理器时间而受到干扰。
数据库服务器本质上是否内存不足?SQL Server将尝试分配它可以分配的每个字节,但是如果容量已满,并且您的查询需要加载更多数据,则必须回退到使用虚拟内存,这从根本上增加了简单查询可能花费的时间。
数据库服务器的网络带宽是否较小,无法及时处理数据传输?
最终,听起来好像您托管SQL Server的计算机的大小无法满足您的需求。您最终有可能最终达到了性能急剧下降的硬件极限。如果是这种情况(上述问题将帮助您确定),那么您将需要将数据库移至适合您要处理的数据(和查询)大小的服务器。
这可能意味着使用更快的处理器,更快的驱动器或仅安装更多的RAM。
正如许多人已经指出的那样,通常会有一个持久的事务,这主要是由于我错过了使用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;
https://www.brentozar.com/archive/2018/02/set-implicit_transactions-one-hell-bad-idea/