【发布时间】:2018-12-14 20:23:06
【问题描述】:
我有一个作业因为阻塞而失败,我想做的是在我运行该作业时停止到数据库的所有事务以避免阻塞。那么,任何人都可以帮助解决如何停止所有事务然后运行该作业吗?
【问题讨论】:
-
如果是生产系统,那么你应该解决根本原因。单一模式不是灵丹妙药。
标签: sql-server tsql database-administration
我有一个作业因为阻塞而失败,我想做的是在我运行该作业时停止到数据库的所有事务以避免阻塞。那么,任何人都可以帮助解决如何停止所有事务然后运行该作业吗?
【问题讨论】:
标签: sql-server tsql database-administration
有时您只需要先解决问题,然后才有时间研究根本问题。因此,考虑到这一点,您可以创建一个计划任务来重新启动 SQL Server (https://blog.sqlauthority.com/2014/11/03/sql-server-powershell-way-of-restarting-sql-server-service/)。我不建议将此作为永久解决方案,但如有必要,它可以帮助您。
有多种方法可以解决您的问题。鉴于您提供的信息有限,我将提供一些想法:
1) 在合理的情况下添加 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(无论是在失败的工作上还是在您的过程或代码中的任何其他 SQL 上)。您不想将它用于需要绝对精确的事物。例如,不要将它与任何涉及金钱的事物一起使用。但它通常使用起来非常安全(一些理想主义者会为此争论……如果您是理想主义者,请忽略此建议。如果您是实用主义者,那么这是必须的)。
WITH (NO LOCK) 也做同样的事情,但是是逐个表的。我会留给你用谷歌搜索这些术语并了解更多信息。
2) 使用活动监视器(应该是 SQL Server Management Studio 工具栏中的图标)查看作业执行时正在运行的内容以了解问题可能是什么,您也可以使用它来终止进程.
3) 使用 Sql Server Profiler(在工具菜单下)查看正在运行的查询。
4) 使用查询查看所有查询正在运行:https://blog.sqlauthority.com/2009/01/07/sql-server-find-currently-running-query-t-sql/
【讨论】:
我相信您首先需要发现根本原因,但如果确实需要,那么您可能需要执行以下操作 -
在光标中运行以下代码-
SELECT conn.session_id
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
ON sess.session_id = conn.session_id;
在光标中,将每个会话 id(@sessionId) 放入变量中并使用以下 -
kill @sessionId
下面是完整的代码 -
DECLARE @session_id int
declare Mycursor cursor for
SELECT conn.session_id
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
ON sess.session_id = conn.session_id
OPEN Mycursor
FETCH NEXT FROM Mycursor INTO @session_id
WHILE @@FETCH_STATUS = 0
BEGIN
Exec ('kill ' + @session_id)
FETCH NEXT FROM Mycursor INTO @session_id
END
CLOSE Mycursor;
DEALLOCATE Mycursor;
【讨论】: