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