2016-05-18 4 views
2

私はSQL Serverトリガを持っています。正直言って、トリガーが暗黙的にACIDAtomicity, Consistency, Isolation, Durability)に従っているかどうかはまだ分かりませんが、現時点ではトリガーは特に複雑なことはしません。SQL Serverトリガ内のストアドプロシージャ呼び出しは、暗黙的にスレッドセーフでアトミックですか。

今、私はトリガー内からストアドプロシージャを呼び出したいと思います。私はTRANSACTIONストアドプロシージャコールとINSERTステートメントを囲んでいる。

私の質問は:少なくとも部分的には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

基礎となる操作とトリガー操作は、アトミックとして扱われます。彼らは両方とも1つのトランザクションでコミットします。 the documentationから:

トリガーし、それが単一のトランザクションとして処理されている発射の文...

注意トリガー(とSPが呼び出すされる)は文句を言わない」テーブルの変更を参照してくださいということトリガーを発したまだコミットしていない。

+0

ありがとうございます。面白い。したがって、INSERT文はトリガが終了するまで実際にコミットしません。つまり、私のストアドプロシージャがテーブルの変更に依存する場合、これはストアドプロシージャを置く場所が間違っている可能性があります。 – user3621633

+0

@ user3621633では、INSERTEDの値をSPに渡す必要があります。 – Jodrell

+1

これは少し個人的な好み/スタイルのものですが、私はトリガーを避ける傾向があります。彼らはテーブルを調べるときに見過ぎやすいです。あなたがやっていることのために、ちょうど格納されたprocを呼び出して、あなたがそこで何をしているのと一緒にテーブルを更新するようにしてください。 – WPrecht

関連する問題