私はSQL Serverトリガを持っています。正直言って、トリガーが暗黙的にACID
(Atomicity, 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の原則に従い、競合状態やデッドロックを回避しますか?または、競合状態やデッドロックを防ぐために、トリガーやストアドプロシージャに追加する必要があるものはありますか?
トリガー内のトランザクションを使用して、注意してください。なぜあなたはエラーを処理していないので、なぜ気になるのですか? ANYインサートには暗黙的なトランザクションがあることに注意してください。あなたの呼び出しコードがトランザクションで挿入を作成していて何かがうまくいかない場合、トリガーを終了するときにトランカウントが異なるため、未処理の例外が発生します。インサートがすでにこの操作の原子的性質を扱っているので、私はここでトランザクションを取り除くでしょう。 –
私は 'XCT_ABORT ON'がエラー処理を行うと信じています。トランザクションが失敗した場合はロールバックを実行します.TRANCOUNTとロールバックを明示的にチェックする必要はありません。トリガーでのトランザクションの使用に関しては、私が作成したトランザクション内のコードとトリガーコールのトラン数が異なることを意味していますか?もしそうなら、私はそれがどのように問題になるかを見ています。ストアドプロシージャコールはどうですか?そのスレッドは安全でアトミックですか?あなたの洞察力をありがとう、ショーン – user3621633