[pgsql-jp: 25410] Re: デッドロックが発生する現象について

Hiroshi Inoue Inoue @ tpf.co.jp
2002年 3月 26日 (火) 12:41:25 JST


"kiyoshi.yoshida" wrote:
> 
> MLの皆さま、こんにちは、吉田と申します。
> 今、下記の現象が発生しており困っています。回避する対策方法等ヒントでもい
> ただけないでしょうか。
> 
> テーブルは、
> create table m1(key serial primary key, a int);
> insert into m1(a) values(20);
> create table t1(mykey serial primary key
>         ,key int constraint t1_ref references m1,i int);
> insert into t1(key,i) values(1,10);
> create table t2(mykey serial primary key
>         ,key int constraint t2_ref references m1,j int);
> insert into t2(key,j) values(1,100);
> 
> 現象は、
> トランザクション1
> begin;
> lock table t1 in share row exclusive mode;
> update t1 set i=i+1 where i=10;
> (ここまで実行)
> 
>                                 トランザクション2
>                                 begin;
>                                 lock table t2 in share row exclusive mode;
>                                 (ここまで実行)
> トランザクション1
> insert into t2(key,j) values(1,200);
> (ブロックされる)
>                                 トランザクション2
>                                 update t2 set j=j+1 where j=100;
>                                 (なぜかブロックされる)
> <デッドロック発生>
> となります。
> 
> この動作は、PostgerSQLの正常な動作なのでしょうか。

外部キーの使用により多分m1テーブルの方でロックの競合
が発生しているのではないでしょうか? m1もあらかじめ
ロックする手はあるかもしれません。もっともこんなに
テーブルロックをかけなければいけない理由はよくわかり
ませんが。

Hiroshi Inoue



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