前回 、Oracleの場合と同様にPostgreSQLのCOMMIT失敗時にトランザクションの結果が不定になる状況を確認しました。 今回は、PostgreSQL 10から導入された行方不明になってしまったトランザクションの結果を確認するtxid_status()について確認してみます。 前回のCOMMIT問題のまとめ txid_status()を使う流れ txid_status()でトランザクションの結果が不明になった状態を確認する大まかな流れは以下のような感じになります。 COMMIT前のトランザクションIDをtxid_current()もしくはtxid_current_if_assigned()で取得しておく COMMITの状態が不明になった場合に、1で取得したtxidを引数にしてtxid_status()でトランザクションの状態を確認する 前回 と同じ方法でCOMMITエラーを発生させてみる WALファイルへの書き込み完了前に障害が発生した場合 1) INSERTを実行(AUTOCOMMITはoffに設定) postgres=# insert into sample_table values (1); 2) txid_current()でトランザクションIDを取得 postgres=# select txid_current(); txid_current -------------- 627 (1 行) 3) backendのrecvfrom(2)をブロック(上記シーケンス図の①の部分) postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 18623 (1 行) $ gdb -p 18623 ... (gdb) catch syscall recvfrom Catchpoint 1 (syscall 'recvfrom' [45]) (gdb) c Continuing. 4) COMMITを実行 postgres=# commit; 上記の状態でCOMMITが完了することはありません 5) この状...