[pgsql-jp: 34655] Re: UPDATE実行時のデッドロックについて

Katsuhiko Okano k_okano @ po.ntts.co.jp
2005年 1月 17日 (月) 14:54:47 JST


岡野と申します。

Tanaka-Qtaro-Yasuhiro wrote:
> BEGIN;
> UPDATE a SET counter = counter + 1;
> END;
> 
> という SQL文を同時にたくさん実行すると、以下のエラーにな
> る場合が出てきます。
> ERROR:   deadlock detected
> 
> この更新処理でデッドロックを発生しないようにするにはどの
> ようにすればよいでしょうか。正しい方法をご存知の方はご教
> 示いただけると助かります。

状況によりますが、ただ「ERROR:  deadlock detected」を回避するだけであれば
postgresql.confを
> default_transaction_isolation = 'SERIALIZABLE'
と書き換えて、トランザクション分離(隔離)レベルをSERIALIZABLEにする
という方法もありますね。

ただしこの場合でも競合時は以下のようなメッセージを出力して
ロールバックを行なうのでアプリケーション側で再実行するなど
工夫が必要です。性能も落ちるでしょうし。
> ERROR:Can't serialize access due to concurrent update

詳しくは「PostgreSQL 7.3.2 ユーザガイド Chapter 9. 同時実行制御」
も参照してみてください。
www.postgresql.jp/document/pg732doc/user/transaction-iso.html

-- 
----------------------------------------
Katsuhiko Okano
k_okano at po.ntts.co.jp
NTT Software Corp. (division "NBRO-PT6")




pgsql-jp メーリングリストの案内