質問: とある環境で pgpool→postgresql×2のネイティブレプリケーション構成で pgpool_catalog.insert_lockテーブルを作成しInsert文に対しては、 行ロックをかけているのですが、 動作についていまいち理解ができていません。 以下マニュアルページには ≪http://www.pgpool.net/docs/latest/ja/html/runtime-config-runnung-mode.html≫ 【VACUUM(autovacuumを含む)とのロック競合を最小化することを意図しています。】 と記載があるのですが、 確かに、行ロック時のSELECT FOR UPDATE文のLOCK形式はRowShareLock、 VACUUM (FULLなし)のLOCK形式はShareUpdateExclusiveLockとお互い競合しません。 しかし、そもそもinsert文のLOCK形式はRowExclusiveLockとなっておりVACUUM (FULLなし)と競合しません。 となると、先述した【VACUUM(autovacuumを含む)とのロック競合を最小化することを意図しています。】はどうゆうこと?となり、行ロック形式にする意味がないように見受けられます。 大変お手数ですが、上記の件、 pgpool_catalog.insert_lockテーブルを作成し行ロックをかけることで、 VACUUM(autovacuumを含む)とのロック競合を最小化することが出来る。 と言うところ「その通りだよ」とだれか私に詳しく教えて頂けないでしょうか。
回答: ご提示されたサイトにおいては、「ロック競合を最小」の為にシーケンステーブルに対してテーブルロックを掛けたと言っていると思います。 本体のテーブルにはロックを掛けないのでVACUUMが行われる事を可能に出来ていたと言う事になります。 しかしながらこれはトランザクション周回問題にて、シーケンステーブルに対してテーブルロックはできなくなった様です。 ネイティブリプリケーションの場合、SERIAL型を使っているテーブルへの挿入時は、SERIAL型の列の値がDBノードの間で 一致しなくなることが有るので、テーブルをロックする必要が有ります。 insert_lockを設定しておくと、INSERT命令をロックの付きのINSERT命令に変換してくれます。 insert_lockによってテーブルロックが掛かり、VACUUMと競合するため、INSERT処理が待たされ続ける可能性が発生します。