PL/pgsql 関数を実行するマルチスレッド アプリケーションがあります。その関数は、非常に重要なリソース ( table ) へのレコードの挿入を生成します。また、実行中にいくつかの選択/更新/などの操作を実行します。
問題は、重複した (2-3) レコードが並列スレッドで関数に渡されることがあります。そして、それらはすべて関数の実行結果としてテーブルに挿入されますが、挿入されるべきではありません。
これは、両方のトランザクションが並行して実行され、同じレコードを並行トランザクションに挿入する準備ができていることを認識していないために発生します。
テーブルは非常に重要であり、あらゆる種類のLOCK TABLE
ものは非常に歓迎されません (LOCK FOR SHARE MODE
その間、いくつかの有用な経験として与えられます)。
それで、問題は、マルチスレッドアプリによって実行される重要なリソース(テーブル)で動作し、このリソースに有害なロックを生成しないPL / pgsql関数を編成する方法のベストプラクティスはありますか?
PS。アプリのrecord.IDによるスレッドの分割が可能な解決策であることを私は知っています。しかし、まず PL/pgsql ソリューションに興味があります。