6

私が作業しているプロジェクトには、ブール列が変更されたかどうかを監視する「更新時」トリガーのあるテーブルがあります(例:false-> true =何らかのアクションを実行します)。ただし、このアクションは1行に1回しか実行できません。

データベースにアクセスするクライアントは複数存在するため、最終的には複数のクライアントが同じ行列を並行して更新しようとすることが考えられます。

「更新」トリガー自体が同時実行自体を処理しますか、それともトランザクションでそれを実行して手動でテーブルをロックする必要がありますか?

4

1 に答える 1

17

トリガーは同時実行性を処理しません。明示的なトランザクションを使用するかどうかに関係なく、PostgreSQL は正しいことを行う必要があります。

PostgreSQL は楽観的ロックを使用します。これは、行を実際に更新した最初の人がその行をロックすることを意味します。2 番目の人が行を更新しようとすると、更新ステートメントは、最初の人が変更をコミットするかロールバックするかを確認するために待機します。

最初の人がコミットした場合、2 人目の人は、自分の変更が通過して、自分にとって興味深いかもしれない変更を消去するのではなく、エラーを受け取ります。

最初の人がロールバックすると、2 人目の更新はブロックが解除され、通常通り処理されます。これで、何も上書きされなくなります。

2 番目の人もこのNOWAITオプションを使用できます。これにより、更新が未解決の変更と競合する場合、ブロックするのではなく、すぐにエラーが発生します。

于 2008-11-25T23:55:14.150 に答える