2016-05-18 24 views
2

我有一個SQL Server觸發器。說實話,我不太確定觸發器是否隱含地遵循ACIDAtomicity, Consistency, Isolation, Durability),但目前我的觸發器沒有做任何特別複雜的事情。SQL Server觸發器中的存儲過程調用是否隱含線程安全和原子?

現在,我想從觸發器中調用存儲過程。我有TRANSACTION圍繞存儲過程調用和INSERT語句。

我的問題是:如果一個觸發器,sans存儲過程調用,是線程安全的並且是原子的 - 至少部分是由於TRANSACTION - 存儲過程調用是隱式線程安全的嗎?

下面是觸發的樣子:

CREATE TRIGGER [triggerInsert_Foobar] 
ON [Foobar] 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- Turns on rollack if T-SQL statement raises a run-time error 
    SET XACT_ABORT ON 

    -- Start new transaction 
    BEGIN TRANSACTION 
     -- Insert statement for trigger 
     INSERT INTO Foo (Col1, Col2) 
      SELECT 
       RTRIM (LTRIM (Col1)), 
       Col2 
      FROM 
       INSERTED 

    -- Call stored procedure (takes no parameters) 
    EXECUTE sp_executesql N'FoobarApp_DoSomething' 

    -- Complete transaction 
    COMMIT TRANSACTION 
END; 

謝謝你,親切地對你有所幫助。

其他問題

這個問題正在經過幾次的反應已經蓄勢(謝謝)。我提前道歉。

我的觸發器和隨後調用的存儲過程是否遵循ACID原則並避免競爭條件和死鎖?或者,有什麼我需要添加到我的觸發器和/或存儲過程,以防止競爭條件和死鎖?

+2

非常小心使用觸發器內的事務。既然你沒有錯誤處理爲什麼要麻煩?請記住,ANY插入具有隱式事務。如果您的調用代碼正在使用事務創建插入,並且出現問題,您將得到未處理的異常,因爲退出觸發器時轉換次數會有所不同。因爲插入已經處理了這個操作的原子性質,所以我將擺脫這裏的事務。 –

+0

我相信'XCT_ABORT ON'負責錯誤處理;它在事務失敗時執行回滾 - 不需要顯式檢查TRANCOUNT和回滾。關於在觸發器中使用事務,您說的觸發器調用的轉換次數與我創建的事務中的代碼的轉換次數不同,對嗎?如果是這樣,我明白這可能是一個問題。那存儲過程調用呢?那個線程是安全的嗎?謝謝你的見解,肖恩。 – user3621633

回答

5

將底層操作和觸發操作視爲原子操作。他們都承諾一次交易。從the documentation

觸發器和引發它作爲一個單獨的事務處理的聲明...

注意,觸發器(和SP會被調用)不會」看錶變化那觸發了觸發器。它還沒有承諾。

+0

謝謝。有趣。那麼,在觸發器完成之前,INSERT語句不會實際提交?這意味着如果我的存儲過程依賴於表更改,這可能是放置存儲過程的錯誤地方。 – user3621633

+0

@ user3621633,你必須將'INSERTED'中的值傳遞給SP,這聽起來像個壞主意。 – Jodrell

+1

這是一個個人喜好/風格的事情,但我傾向於避免觸發器。檢查表格時,它們很容易被看到。對於你正在做的事情,只需調用存儲過程並讓它隨着你在那裏做的任何事情一起更新表格。 – WPrecht

相關問題