我有一個SQL Server觸發器。說實話,我不太確定觸發器是否隱含地遵循ACID
(Atomicity, 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原則並避免競爭條件和死鎖?或者,有什麼我需要添加到我的觸發器和/或存儲過程,以防止競爭條件和死鎖?
非常小心使用觸發器內的事務。既然你沒有錯誤處理爲什麼要麻煩?請記住,ANY插入具有隱式事務。如果您的調用代碼正在使用事務創建插入,並且出現問題,您將得到未處理的異常,因爲退出觸發器時轉換次數會有所不同。因爲插入已經處理了這個操作的原子性質,所以我將擺脫這裏的事務。 –
我相信'XCT_ABORT ON'負責錯誤處理;它在事務失敗時執行回滾 - 不需要顯式檢查TRANCOUNT和回滾。關於在觸發器中使用事務,您說的觸發器調用的轉換次數與我創建的事務中的代碼的轉換次數不同,對嗎?如果是這樣,我明白這可能是一個問題。那存儲過程調用呢?那個線程是安全的嗎?謝謝你的見解,肖恩。 – user3621633