[pgsql-jp: 26125] Re: トランザクション内でのレコードの削除

ISHIDA Akio iakio @ pjam.jpweb.net
2002年 5月 24日 (金) 20:15:15 JST


石田です。

On Fri, May 24, 2002 at 06:19:35PM +0900, Hiroshi Inoue wrote:
> 井上です。
> > 
> > この後、select * from t1; すると、
> >  i | j
> > ---+---
> >  1 | a
> > (1 row)
> > 
> > となります。
> > 
> > つまり、b=> が update した時点では、 j = 'a' に該当する
> > レコードがあるはずなのに、update ができないようです。
> > この現象は正常な動きでしょうか?
> 
> PostgreSQLではupdateコマンドが発行された時点で(厳密
> にいうと少し違いますが)存在しなかったデータは処理の
> 対象となりません。この動作が残念ながら好ましくないと
> してもそれを修正するのは容易ではありません。

なるほど。ありがとうございます。
この件は、明示的にテーブルを LOCK をすることで期待した
動作をすることができました。

a=> begin;
a=> lock t1 in share mode;
a=> delete from t1;
a=> insert into t1 values (1, 'a');

b=> begin;
b=> update t1 set i = 2 where j = 'a';

a=> commit;
b=> commit;

a=> select * from t1;
 i | j
---+---
 2 | a
(1 row)
-- 
ISHIDA Akio




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