« 新規追加カラムを任意の位置に挿入したい | トップページ | 久々のOS再インストール »

2014.12.02

役に立つ9.3以後の新機能

PostgreSQLではロック待ちが発生するとデッドロック以外では先行するロック獲得処理が開放されるまで、後続の処理が続行することができなかった。

Informixだと "SET LOCK MODE TO WAIT 60"とすれば60秒以上のロック解放待ちが発生したら、その待たされているクエリをキャンセルすることができるのだが、PostgreSQLではこれができない。
否、できなかった。

ref)[Postgre sql9.3新機能紹介]のスライド#59

9.2以前でこうした処理を組み込みたい場合は"SET statement_timeout = 60000"のようにして擬似的な対策を打つしかなかった。
ただしこの対策はロック待ち時間ではなくそのクエリの開始時間からの経過時間のため、ロック待ち時間+処理時間になってしまうため、単純に遅ーいクエリなどの場合は、正常に動いているのにキャンセルされてしまったりといったリスクがあった。(このstatement_timeoutも最近知ったばかりだが(^^;)

それがlock_timeoutを身につけた9.3では可能になったわけである。

SET lock_timeout=60000;
これである。

まあロック解放待ちが多発しているアプリケーションというのもどうなのよ、という突っ込みはあるけども散々ロック解放待ちされたうえに楽観ロック更新エラーでアボート、といった悲しいことが減ると思われる。

……とはいえPostgreSQLのバージョンをあげないとダメなので、現在関わっているプロジェクトでは使用できないんだけどね(苦笑)

|

« 新規追加カラムを任意の位置に挿入したい | トップページ | 久々のOS再インストール »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/60749215

この記事へのトラックバック一覧です: 役に立つ9.3以後の新機能:

« 新規追加カラムを任意の位置に挿入したい | トップページ | 久々のOS再インストール »