[pgpool-general-jp: 196] Re: 大量のINSERTを行うとデッドロックする

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2007年 7月 10日 (火) 14:18:00 JST


浅羽です。

From: 五十嵐 直隆 (株)モーション <igarashi @ motion.co.jp>
Subject: [pgpool-general-jp: 195] Re: 大量のINSERTを行うとデッドロックする
Date: Tue, 10 Jul 2007 10:28:20 +0900

> > 確認ですが、insert_lock は true に設定してますでしょうか?
> 
> すみません。設定項目から抜けていました。
> insert_lockはtrueに設定しております。

insert_lock を true に設定されている場合

  BEGIN;
  LOCK TABLE table1 IN ROW EXCLUSIVE MODE;
  LOCK TABLE table1 IN SHARE ROW EXCLUSIVE MODE;
  INSERT ...
  COMMIT;

と実行します。次の

  A: BEGIN;
  B: BEGIN;
  A: LOCK TABLE table1 IN ROW EXCLUSIVE MODE;
  B: LOCK TABLE table1 IN ROW EXCLUSIVE MODE;
  A: LOCK TABLE table1 IN SHARE ROW EXCLUSIVE MODE;
  B: LOCK TABLE table1 IN SHARE ROW EXCLUSIVE MODE;

という流れになると PostgreSQL ではデッドロックを検知します。
pgpool では今のところデッドロックエラーについて何も考慮していないため、

  * node-1 ではデッドロックによってトランザクションがアボート
  * node-2 ではロックが獲得できた

という不整合が発生しているようです。

そこで、マスタからデッドロックエラー(エラーコード: 40P01)が返ってきた
場合には、他のノードにはトランザクションがエラーになるようなクエリを送
るように修正しようかと考えています。

当面は最初のテーブルロックに SHARE ROW EXCLUSIVE MODE を指定していただ
くか、replication_stop_on_mismatch を false にしてください。

よろしくお願いします。
--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp


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