[pgsql-jp: 33710] Re: 【再質問】UPDATE のTrigger 内で発行したInsert がwait

白神 正雄 shiraga_masao2 @ hotmail.com
2004年 7月 20日 (火) 18:26:04 JST


白神です。


谷田さん、ありがとうございます。

早速、pg_locksを見てみましたが、
やっぱり、UPDATE(トリガ)とINSERT(別プロセス)が
干渉しあってるように見えてしまいます・・。


===========================================================================
 relation | database | transaction | pid  |       mode       | granted 
----------+----------+-------------+------+------------------+---------
  5324359 |  5324347 |             | 2373 | AccessShareLock  | t
  5324359 |  5324347 |             | 2373 | RowExclusiveLock | t
  5324359 |  5324347 |             | 2406 | AccessShareLock  | t
  5324359 |  5324347 |             | 2406 | RowShareLock     | t
  5324465 |  5324347 |             | 2373 | AccessShareLock  | t
  5324465 |  5324347 |             | 2373 | RowExclusiveLock | t
          |          |     4131787 | 2406 | ShareLock        | f
          |          |     4131787 | 2373 | ExclusiveLock    | t
  5324432 |  5324347 |             | 2406 | AccessShareLock  | t
  5324432 |  5324347 |             | 2406 | RowExclusiveLock | t
  5324389 |  5324347 |             | 2373 | AccessShareLock  | t
  5324389 |  5324347 |             | 2406 | AccessShareLock  | t
  5324432 |  5324347 |             | 2373 | AccessShareLock  | t
  5324432 |  5324347 |             | 2373 | RowExclusiveLock | t
          |          |     4131790 | 2406 | ExclusiveLock    | t
    16757 |  5324347 |             | 2480 | AccessShareLock  | t
          |          |     4132163 | 2480 | ExclusiveLock    | t
(17 rows)
===========================================================================

上記の中で、ExclusiveLockをかけているのが、
プロセスID=2373,2406,2480
の3プロセスです。


===========================================================================
XXX       2372  2330  0 16:39 pts/3    00:00:00 psql 
XXXdb_beta_0_3h_shiraga
postgres  2373  2256  0 16:39 ?        00:00:00 postgres: XXX 
XXXdb_beta_0_3h_shiraga [local] UPDATE
root      2395  2373  0 16:41 ?        00:00:00 /bin/sh 
/home/XXX/XXX_trigger_tj1b/smount.sh
root      2403     1  0 16:41 ?        00:00:00 smbmount 
//XXX.XXX.XXX.XXX/mnt /mnt/XXX_smb1 -o guest
root      2405  2395  0 16:41 ?        00:00:00 
/home/XXX/XXX_trigger_tj1b/XXXXXX.exe
postgres  2406  2256  0 16:41 ?        00:00:00 postgres: XXX 
XXXdb_beta_0_3h_shiraga 127.0.0.1 INSERT waiting
  ・   ・  ・   ・       ・   ・
  ・   ・  ・   ・       ・   ・
  ・   ・  ・   ・       ・   ・
XXX       2479  2436  0 16:57 pts/4    00:00:00 psql 
XXXdb_beta_0_3h_shiraga
postgres  2480  2256  0 16:57 ?        00:00:00 postgres: XXX 
XXXdb_beta_0_3h_shiraga [local] idle
XXX       2488  2284  0 17:01 pts/2    00:00:00 ps -ef
===========================================================================

※プロセスID=2480は、「select * from pg_locks」するために起動した
 別端末であり、今回関係ありません。


XXXdb_beta_0_3h_shiragaというDBのTABLE_AのUPDATEトリガーとして登録した
C言語プログラムからsystem関数でC++プログラムを起動し、C++から
TABLE_BへのINSERTを行っています。

このとき、確かに、TABLE_AへのUPDATEのトランザクションと
TABLE_BへのINSERTのトランザクションは別トランザクションで
動くとは思いますが、テーブルとかDB単位にロックしてる個所は
どこにもないため(少なくとも明示的には)、MVCCの機構でうまく
動いてくれそうな気がしていたのですが・・・。


TABLE_BへのINSERTがwaitingさせられる状態になる原因として
何が考えられるでしょうか??




>From: TANIDA Yutaka <tanida @ sra.co.jp>
>Reply-To: pgsql-jp @ ml.postgresql.jp
>To: pgsql-jp @ ml.postgresql.jp
>Subject: [pgsql-jp: 33709] Re: 【再質問】UPDATE  のTrigger 内で発行した
Insert がwait
>Date: Tue, 20 Jul 2004 15:54:30 +0900
>
>谷田です。
>
>On Tue, 20 Jul 2004 06:41:40 +0000
>白神 正雄 <shiraga_masao2 @ hotmail.com> wrote:
>
> > 現状、次のような処理でInsertがwait状態になってしまい、返ってきません。
> >
> >   【OS:RedHat ES, DB:Postgres7.3.6】
> >   TABLE_A : Updateトリガー(AFTER) ・・・C言語関数呼び出し
> >      |
> >      +−shell起動 <成功>
> >      ・   |
> >      ・   +−【WindowsXP】フォルダにsmbmount <成功>
> >      ・   |
> >      ・   +−C++で作成のexe(要するに実行形式)を起動
> >      ・   ・   |
> >      ・   ・   +−【WindowsXP】フォルダにある
> >      ・   ・   ・   CSVファイルを読み込み、
> >      ・   ・   ・   TABLE_Bにインサート
> >      ・   ・   ・   ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
> >      ・   ・   ・   ここでinsert wait(ToT)
> >      ・   ・   |
> >      ・   ・   +−正常時戻り値0
> >      ・   ・     I/Oエラーなどあれば戻り値1
> >      ・   ・   |
> >      ・   +−−+
> >      ・   |
> >      ・   +C++のexeの戻り値をそのままC言語関数に返す
> >      ・   |
> >      +−−+
> >      |
> >      +C++のexeが戻り値0ならTABLE_Aのフラグ=4
> >            戻り値1ならTABLE_Aのフラグ=5
> >      |
> >      |
> >     <終了>
> >
> >
> > 上記の処理の中で、shell以下は、単体では、バリバリに動きます。
> >
> > が、そのshellをトリガーとして登録した関数から起動するように
> > すると、insert wait状態になり、一行もinesertできなくなるんです。
>
>ところで、このINSERT文はどのロックを待っているんでしょうか?それが分から
>ないことには、解決のしようがないと思うのですが。
>
>とりあえず、select * from pg_locksの出力を調べてみてはいかがでしょうか。
>
>
>--
>TANIDA Yutaka <tanida @ sra.co.jp>
>

_________________________________________________________________
楽しい絵文字でココロ伝わるメッセンジャー http://messenger.msn.co.jp/ 




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