什麼是 SQL Server 2000 spid -2?
我有一台 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。
在 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;