1

タイトルが示すように、私の短い質問は次のとおりです。postgresトリガーで動的にロードされたC関数を使用する場合、それはブロッキング呼び出しですか、それとも非ブロッキング呼び出しですか?

背景:データベースの挿入/更新/削除に続いてXMLを生成する必要があります。私が検討した2つのオプションは次のとおりです。

  1. I / U / D操作中に使用するように書き込まれるイベントテーブルを作成し、これらのイベントをデーモンがポーリングしてXMLを生成します。
  2. postgresのトリガーの一部としてこのXMLを生成するC関数を作成します。

オプション2を使用するとリアルタイムの更新が提供されますが、XMLメッセージの生成と送信などにオーバーヘッドが発生するため、各操作の間にxmlを作成するため、100行の挿入にかかる時間が大幅に長くなることが懸念されます。

4

2 に答える 2

4

トリガーは、C で実装されているか他の言語で実装されているかに関係なく、同期的です。一度に 1 つのトリガーが実行され、すべてのトリガーが実行されるまで、トリガー以外のステートメントを実行することはできません。PostgreSQL では、トリガーはアルファベット順に実行されます。

ロックを取得しない限り、トリガーは他のトランザクションのステートメントをブロックしないことに注意してください。同じトリガーが 3 つの異なるトランザクションの 3 つの異なる実行ポイントで実行されている可能性がありますが、4 番目のトランザクションは同じテーブルで後のトリガーを実行し、5 番目のトランザクションは.INSERT

したがって、トリガーは同じトランザクションの後のステートメントをブロックしますが、他のトランザクションのステートメントはブロックしません。

ところで、PostgreSQL は非同期トリガーを提供していません。それらは制御を返すことができないため、実行を続けながらさらに多くのステートメントを実行します。すべてのトリガーはブロッキングで同期的です。非同期トリガーと同等のものは、 や のようなキューイング メカニズムを介して一種の可能性がLISTENありNOTIFYますPgQ。速度が心配な場合は、生成を非同期でNOTIFY行うLISTENing デーモンをトリガーしてください。

于 2012-07-05T12:39:01.867 に答える
1

はい、「ブロック」します。トリガーを実行させる SQL は、トリガーが完了するまで完了しません。

ドキュメントで詳細を参照してください。

于 2012-07-04T15:09:46.097 に答える