[pgcluster: 228] Re: デッドロックもしくはそれに類似した症状について
TANIDA Yutaka
tanida @ sra.co.jp
2004年 3月 31日 (水) 16:09:45 JST
谷田です。調べてみました。
On Tue, 30 Mar 2004 21:28:11 +0900
Wataru Oguro <oguro @ zenrin-datacom.net> wrote:
> 最初にお詫びいたします。
> 私がPGClusterの検証用に使用したSQLファイルを添付いたします。
> メーリングリストにこのようなものを添付するのはマナーに問題があるかと思い
> ますが、文章だけでは伝わらないかと思い、添付した次第です。
大量に同じSQL文が書かれているだけなので、単一トランザクションを例示する
だけで良かったのではないですか?
抜き出したトランザクションは以下の物です。
> begin;
> select count(*) from test;
> lock table test;
> insert into test values('test');
> commit;
このトランザクションには、PGclusterから見ると、やっかいな問題が2つあり
ます。
・実はlock tableがトランザクション監視対象に入っていない
・上記をfixしても、実はlock tableとselectがロックで競合して、それで止ま
る。
このうち、下の件は意外にやっかいですが、トランザクションの設計方針を変え
る事で回避可能のようです。
・lock tableするのを、selectより先にする。
・lock tableのレベルを下げる(例えば、exclusive modeとか)
以下のpatchはlock tableが対象でないのを解消させるpatchです。本当に適当に
作っただけなので、誰かなおしてください。
*** postgres.c 2004-03-22 11:32:29.000000000 +0900
--- postgres.c.new 2004-03-31 15:47:58.000000000 +0900
***************
*** 62,67 ****
--- 62,69 ----
#ifdef USE_REPLICATION
#include "replicate.h"
+
+ #define CMD_LOCK 12345
#endif /* USE_REPLICATION */
/* ----------------
***************
*** 672,677 ****
--- 674,682 ----
case T_SelectStmt:
origCmdType = CMD_SELECT;
break;
+ case T_LockStmt:
+ origCmdType = CMD_LOCK;
+ break;
default:
/* Otherwise, never match commandType */
origCmdType = CMD_UNKNOWN;
***************
*** 773,779 ****
if ((origCmdType == CMD_INSERT ) ||
(origCmdType == CMD_UPDATE ) ||
(origCmdType == CMD_SELECT ) ||
! (origCmdType == CMD_DELETE ))
{
PGR_Need_Notice = true;
PGR_Check_Lock.check_lock_conflict = true;
--- 778,785 ----
if ((origCmdType == CMD_INSERT ) ||
(origCmdType == CMD_UPDATE ) ||
(origCmdType == CMD_SELECT ) ||
! (origCmdType == CMD_DELETE ) ||
! (origCmdType == CMD_LOCK) )
{
PGR_Need_Notice = true;
PGR_Check_Lock.check_lock_conflict = true;
--
TANIDA Yutaka <tanida @ sra.co.jp>
pgcluster メーリングリストの案内