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