SQL服务器事务超时

SQL服务器事务超时

是否有任何参数可以阻止长事务?我想自动回滚所有耗时超过 5 分钟的事务。可以吗?我正在使用 Microsoft SQL Server 2008 R2。

背景通知:

我之所以问这个问题,是因为我正在使用许多糟糕的应用程序:如果应用程序出现异常,它们会显示模式警报,只有当警报关闭时才会释放事务。我真的知道这看起来像个笑话,但事实并非如此!我无法改变这些应用程序,也不能解雇他们的开发人员,但我需要解决这个问题:长事务(也可以是低成本的简单事务)必须少于 5 分钟。否则,一些表将被锁定,直到模式关闭。

答案1

有一个名为“查询管理器成本限制”的选项,它采用整数值。您指定的值是查询可以运行的最大时间(以秒为单位)。请注意,这是基于估计时间和值。如果成本超过此值,则不允许执行查询。这不是一门精确的科学,有些可能运行时间更长,而有些不允许的可能运行时间更短,因为它基于估计成本。

http://technet.microsoft.com/en-us/library/ms190419(v=sql.105).aspx

答案2

您可能对其他 StackOverflow 线程感兴趣:

限制 SQL Server 中可用于查询的资源

https://stackoverflow.com/questions/9336194/limit-resources-available-to-query-in-sql-server

答案3

这是我的临时答案:

DECLARE @ProcessId int=null;

SELECT top 1 @ProcessId=p.spid
--, s.host_name, s.program_name, s.original_login_name, q.text as sql, wp.spid as waiting_sess, ws.host_name as waiting_host_name, ws.program_name as waiting_program_name, wr.wait_time as waiting_time, wq.text as waiting_sql
FROM sys.sysprocesses p
join sys.dm_exec_sessions s on s.session_id=p.spid
join sys.dm_exec_connections c on c.session_id=p.spid
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) AS q
join sys.sysprocesses wp on wp.blocked=p.spid
join sys.dm_exec_sessions ws on ws.session_id=wp.spid
join sys.dm_exec_requests wr on wr.session_id=wp.spid
CROSS APPLY sys.dm_exec_sql_text(wr.sql_handle) AS wq
WHERE p.spid in (select distinct blocked FROM sys.sysprocesses where blocked>0) 
and p.blocked<=0
and wr.wait_time>300000 --5min
-- uncomment the next line to really kill process
-- if @ProcessId is not null EXEC('KILL ' + @ProcessId);

这是一个查询,用于获取所有等待资源超过 5 分钟(300000 毫秒)的阻塞进程。此后,它将使用该 pid 执行终止操作。我将使用 Sql server 代理安排此存储过程。

相关内容