[SQL SERVER]透過 IMPLICIT_TRANSACTIONS 避免Block

[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

image

新增檔案資料 to DB的程式碼是很單存的ADO.net且沒有使用任何交易

image

 

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一切正常

image

image

 

2.使用交易執行該SP會發生Block情況

image

 

image

可以看到 53和54互相封鎖(Block),由於53非同步作業受到54父交易未commit影響,

導致54一直無窮迴圈(實務上記得設定最大執行時間來避免)。

 

 

由於我花了快一天時間還是無法測試出SSIS如何不參予父交易,

所以我後來只好往SP來下手並避開該問題

 

SP設定 IMPLICIT_TRANSACTIONS ON

image

不管有無父交易,該SP都能正常查詢。

 

image

image

 

參考

[SQL SERVER][Memo]設定SSMS隱含交易