我有一个作业由于阻塞而失败,我想做的是在运行该作业时停止所有到数据库的事务,以避免阻塞。那么,有人可以帮助您如何停止所有事务然后运行该作业吗?
答案 0 :(得分:0)
我相信您首先需要发现根本原因,但是如果绝对需要,那么您可能需要执行以下操作-
在游标中的代码下方运行-
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;
答案 1 :(得分:0)
有时候,您只需要解决一个问题,然后再有时间调查根本问题。因此,考虑到这一点,您可以创建计划任务以仅重新启动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(在失败的工作以及proc或代码中的任何其他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/