Sql-Server-2000

什麼是 SQL Server 2000 spid -2?

  • July 22, 2014

我有一台 SQL Server 2000 機器,上面有一個相當大的數據庫——幾乎有 TB 大小。

有一個特定的表是一些生產問題的根源,任何試圖修復它的嘗試似乎都會導致同樣的問題….自阻塞(我知道這在 SQL Server 2000 SP4 上沒什麼大不了的,但是-2) 的阻塞 spid。

甚至類似的東西也會SELECT count(1) FROM <MyProblemTable>導致這個 spid(-2) 出現。我進入表格屬性,大約有 150 萬行,這並不多。在更大的表上執行相同的計數語句沒有問題。我確實注意到這張表上的碎片非常高(大約 45%),但任何重建或重組的嘗試都會對系統造成嚴重破壞。我嘗試在周末執行重組大約 8 個小時,但工作仍在執行,人們抱怨超時問題。

然後前幾天,我嘗試使用導入/導出嚮導將表複製到我的本地實例,它在前 250K 行中執行良好,我也在監視sysprocesses並看到 ETL 過程的 spid。前 250K 行很好……然後嚮導行數不再增加。然後我檢查了 2K 框上的 spid,它再次被 spid(-2) 阻止。

桌子到底有什麼問題?是否存在完整性問題?在不發生這種情況的情況下對其執行 SELECT 語句的唯一方法是使用 NOLOCK。

從文件中sp_who

在 SQL Server 2000 中,所有孤立的 DTC 事務都被分配了 SPID 值“-2”。孤立的 DTC 事務是不與任何 SPID 關聯的分佈式事務。因此,當一個孤立的事務阻塞另一個程序時,這個孤立的分佈式事務可以通過其獨特的“-2”SPID 值來辨識。有關詳細資訊,請參閱殺死。

您可以使用以下方法找到作品的實際所有者:

USE master;
GO
SELECT req_transactionUOW -- UOW GUID
 FROM syslockinfo 
 WHERE req_spid = -2;

然後你可以使用:

KILL 'GUID_from_above';

SPID -2 是一個孤立的分佈式事務。

如果您有 SPID 的工作單元 (UOW),則可以 KILL UOW。你得到這個:

SELECT request_owner_guid 
FROM sys.dm_tran_locks 
WHERE request_session_id = -2

如果 OUW 全部為零 00000000-0000- 等,那麼您需要一種不同的方法來擺脫 SPID -2。我有筆記說:

sp_configure 'in-doubt xact resolution', 2; -- Aborts the transaction
GO 
ALTER DATABASE DatabaseName SET ONLINE;

引用自:https://dba.stackexchange.com/questions/50584