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