rgh*_*ome 2 sql-server transaction blocking
我们有一个在大型 J2EE 应用程序中运行的 UPDATE 语句,该语句被其他语句阻塞。更新使用主键,所以它应该只影响一行。应用程序中使用的隔离级别应该是 READ UNCOMMITTED,所以它应该只是导致阻塞的另一个修改,但我们看不到在哪里。
我们已经获得了所有阻塞事务的报告,这确实显示了一个阻塞更新的会话。使用DBCC INPUTBUFFER
命令显示阻塞会话执行的最后一条语句,但这是另一个表上的 SELECT 而不是 UPDATE,所以我认为它不可能是原因。我认为它必须是交易中较早的声明。
至此,我的SQL Server知识枯竭,重现问题也有问题;它间歇性地发生。
我应该知道采取哪些步骤来查找阻塞语句?
在运行更新之前:
SELECT @@SPID;
Run Code Online (Sandbox Code Playgroud)
现在,运行更新,如果它完成得不够快,则在另一个窗口中运行:
SELECT status, command, wait_type, last_wait_type, blocking_session_id
FROM sys.dm_exec_requests
WHERE session_id = <@@SPID from above>;
Run Code Online (Sandbox Code Playgroud)
如果您在 中获得一个值blocking_session_id
,那么您可以对该 SPID 运行相同的查询。你也可以说:
DBCC INPUTBUFFER(<blocking spid>);
Run Code Online (Sandbox Code Playgroud)
(好吧,只要您不在 SQL Azure 上。)
如果这没有产生任何线索,那么阻塞语句可能实际上位于更大事务中的不同点。您必须通过确定该 spid 的执行位置以及它是否是一批临时 T-SQL、存储过程等来跟踪它。“看这里”真的没有什么神奇之处!我们可以为您提供。
如果它没有被阻止,您可能会在其他列中找到相关信息,这些信息可以帮助确定为什么它很慢(例如,它可能正在等待一个巨大的日志自动增长事件)。