「pg_cancel_backend」と「pg_terminate_backend」の違い
・SIGINT or SIGTERM(プロセスに送るシグナル) ・現在の問合せの取消 or プロセスそのものの終了。 ・実行性能の違いはない ともにシグナル送付で処理を終了させるかプロセス終了させるかなので、性能に差異はない。 強いて言えば、pg_cancel_backendは失敗することがある。【実行例】
1.処理をキャンセルしたい場合、pidをpg_cancel_backendでキャンセル。
2.上記でキャンセルできなければ、pidをpg_terminate_backendでプロセス終了。
※pg_cancel_backend、pg_terminate_backendは、他バックエンドプロセスやセッションのトランザクションをキャンセル、プロセス終了することはない。
※pg_cancel_backendが返ってこない場合は連続実行するではなく、一旦pg_cancel_backendのセッションを終了させてから、pg_terminate_backendをする方がよい。
【その他】
・各関数の引数(pid)についてpg_cancel_backendを実行した際、実は元のPIDのクエリーは終わってて、別のクエリーが同一pidで該当し、想定外のクエリーをキャンセルすることはタイムラグの程度によってはあり得る。
・pidの再利用に制約はなく、OS側での利用状況に依存する。
・pg_cancel_backendに、PID以外のquery_startの条件を指定する方法等はない。