[SQL SERVER]透過 IMPLICIT_TRANSACTIONS 避免Block
之前透過非同步啟動Agent Job來處理一些耗時作業(參考 [SQL SERVER] 非同步呼叫SP不使用service broker or xp_cmdshell )
由於我的Agent Job 會透過SSIS平行進行複製檔案和新增檔案紀錄,
在沒有包交易情況下一切執行正常,但今天同事呼叫該SP並包交易就會發生錯誤(Block),
主要是因為最外層交易未commit所導致,
今天我花了大部分時間針對SSIS package的 transactionoption屬性測試,
但不管如何SSIS package還是會join父交易,這裡記錄一下我透過IMPLICIT_TRANSACTIONS 來解決,
如有更好的方法還請告知。
SSIS control flow
新增檔案資料 to DB的程式碼是很單存的ADO.net且沒有使用任何交易
SP script
alter proc usp_t2
as
set nocount on
begin try
exec dbo.USP_asyunjob 'd:\Package.dtsx'
WHILE (1 = 1)
BEGIN
WAITFOR DELAY '00:00:2'
IF EXISTS(
SELECT 1
FROM ttt with(nolock) where c1='rico'
)
break;
IF NOT EXISTS(
SELECT 1
FROM ttt with(nolock) where c1='rico'
)
CONTINUE;
END
SELECT * FROM ttt with(nolock) where c1='rico'
end try
begin CATCH
declare @msg nvarchar(4000)
set @msg='error'+error_message()
raiserror(@msg,16,1)
end CATCH
1未使用交易執行該SP一切正常
2.使用交易執行該SP會發生Block情況
可以看到 53和54互相封鎖(Block),由於53非同步作業受到54父交易未commit影響,
導致54一直無窮迴圈(實務上記得設定最大執行時間來避免)。
由於我花了快一天時間還是無法測試出SSIS如何不參予父交易,
所以我後來只好往SP來下手並避開該問題
SP設定 IMPLICIT_TRANSACTIONS ON
不管有無父交易,該SP都能正常查詢。
參考