ORA-01591 錯誤訊息為「lock held by in-doubt distributed transaction」,通常發生於分散式交易(Database Link 交易)因網路中斷、遠端資料庫異常等原因,導致交易處於「in-doubt」狀態,阻塞後續操作。
SELECT 'ROLLBACK FORCE ''' || LOCAL_TRAN_ID || '''' FROM SYS.PENDING_TRANS$;
ROLLBACK FORCE 'LOCAL_TRAN_ID';
COMMIT FORCE 'LOCAL_TRAN_ID';
SET TRANSACTION USE ROLLBACK SEGMENT SYSTEM;
DELETE FROM DBA_2PC_PENDING WHERE LOCAL_TRAN_ID = 'LOCAL_TRAN_ID';
DELETE FROM PENDING_SESSIONS$ WHERE LOCAL_TRAN_ID = 'LOCAL_TRAN_ID';
DELETE FROM PENDING_SUB_SESSIONS$ WHERE LOCAL_TRAN_ID = 'LOCAL_TRAN_ID';
COMMIT;
BEGIN
FOR r IN (SELECT LOCAL_TRAN_ID
FROM DBA_2PC_PENDING t
WHERE t.STATE = 'collecting') LOOP
DBMS_OUTPUT.PUT_LINE('DELETE FROM DBA_2PC_PENDING WHERE LOCAL_TRAN_ID = ''' || r.LOCAL_TRAN_ID || ''';');
DBMS_OUTPUT.PUT_LINE('DELETE FROM PENDING_SESSIONS$ WHERE LOCAL_TRAN_ID = ''' || r.LOCAL_TRAN_ID || ''';');
DBMS_OUTPUT.PUT_LINE('DELETE FROM PENDING_SUB_SESSIONS$ WHERE LOCAL_TRAN_ID = ''' || r.LOCAL_TRAN_ID || ''';');
END LOOP;
DBMS_OUTPUT.PUT_LINE('COMMIT;');
END;
/
執行上述產出的 DELETE/COMMIT 指令即可批次清理。
若所有指令均失效,可嘗試重啟 Oracle 服務。實務經驗顯示,在執行 COMMIT FORCE 失敗後重啟,鎖定有機會自動釋放(前提是已嘗試過強制提交)。
DBA_2PC_PENDING 視圖,設定告警偵測長時間 in-doubt 交易ORA-01591 處理核心在於:識別交易 ID → 強制提交/回滾 → 字典層級清除 → 實例重啟。建議依序嘗試,並做好事前監控與事後複盤。