PostgreSQLのトランザクションメモ
提供: Astarisk Works Wiki
PostgreSQLのトランザクションとロックに関するメモ
目次 |
トランザクションについて
PostgreSQLではトランザクションをサポートしているので、複数のテーブルに渡る更新もアトミックに行うことができる。
ロックには一般にテーブルロックと行ロックがあるが、両方をサポートしている。
更新のためのselect
select文で値を確認してからupdateすることはよくある。そのときupdateに先立って実行するクエリで引っかけた対象が別の処理により変更されるとまずい場合もある。
その場合、select for updateまたはselect for shareを利用すればよい。
ロックの状態を確認する
ロックの状態はpg_locksビューをselectすれば確認できる。pg_databaseやpg_classと結合すれば、ロックが発生しているテーブルも知ることができる。
たとえば次のようなselect文を使うとロックとそれが発生しているテーブルを調べることができる。
select b.relname, a.* from pg_locks a LEFT OUTER JOIN pg_class b ON a.relation=b.relfilenode order by a.pid;
ロックを強制的に削除する
ロックを強制的に削除するにはpg_locksでロックが生じているプロセスのpidを調べ、pg_cancel_backend(pid)でクエリーの処理をキャンセルするか、OSのkillコマンドでそのプロセスをkillしてやればよい。
ただし、実行した場合の影響を考慮する必要がある。