0

最近、いくつかのクライアントプロジェクトでFirebirdサーバーと戦っています。プログラミング環境でのデッドロックの問題を回避できますが、トリガーでいくつかの作業を行いたいと思います。StackOverflowから得たアドバイスのおかげで、私は本当に目標に近づいていますが、トリガーのキャッチデッドロックに関する情報が見つかりません。ロックが解除されるまで待って、トリガー手順を続行してください。誰かが私にリンクやそれに直面する方法をアドバイスしてもらえますか?

更新または挿入を含む単純なトリガー定義:

CREATE TRIGGER XYZ FOR TABLE_X ACTIVE AFTER UPDATE POSITION 0 AS
begin
    UPDATE TABLE_X SET FIELD = 1 where contidion
end

変更したい行が他のプロセスによってロックされている場合の問題を回避するにはどうすればよいですか?

よろしく、Artik

4

1 に答える 1

1

コメントで、トリガーが発生したのと同じ行を更新するとします。この場合、現在のトランザクションにはすでに行に「ロック」があり、再度変更できるため、デッドロックは発生しません。しかし、あなたのアプローチは間違っています。トリガーが発生した同じ行のコンテンツを変更する場合は、トリガーを使用するのではなくAFTER UPDATEBEFORE UPDATEトリガーを使用し、NEWトリガーコンテキスト変数を使用して1つ以上の列を更新する必要があります。

したがって、トリガーは次のようになります。

CREATE TRIGGER XYZ FOR TABLE_X ACTIVE BEFORE UPDATE POSITION 0 AS
begin
    IF condition THEN
       NEW.FIELD = 1;
end
于 2013-02-01T09:35:23.650 に答える