[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 メーリングリストの案内