|
分類:[データベース全般]
トリガを作成していてふと思ったので質問があります。
例えばテーブルAにプログラムでINSERTするような処理があったとして そのINSERTされた時にトリガでテーブルBに何か処理をするトリガを作成するとします。 プログラムの方はトランザクション処理をしていて、失敗したらロールバックなどやるようにしていて もし失敗したとしたら、トリガの方は動作しないんでしょうか? ちゃんとコミットが完了してから初めてトリガが動作するんでしょうか?
逆に、トリガの方のトランザクションも気になります。 プログラムの方は成功して、プログラム側でコミットを切ってしまっていると それが終わった後にトリガが走るとしたら、そのトリガで失敗したらどうなるんでしょう? テーブルAにプログラムでINSERT→成功したのでコミット ↓ テーブルAのINSERTに反応するトリガがテーブルBにログのような物をINSERT→失敗 こんな状態になった時、テーブルAにはデータが入っているのに テーブルBにはデータがない事になってしまいますが、どうするんでしょう? こういう事にはなりえなのでしょうか? それとも何か方法があって、それで対処するんでしょうか?
トリガ自体にトランザクション処理をしても、テーブルAの方はプログラム側でコミットしているので トリガが動作する時には既にコミットされていますよね? テーブルAの処理は外部からのプログラム。 テーブルBはデータベース自体の処理なので、別々のトランザクションになると思うので。 ストアドとかならプログラム側のトランザクション内でストアド呼べば 同一トランザクション内で完結するので大丈夫かと思いましたが トリガの場合、こういうのはどうやって対処していくんでしょうか?
|