[pgsql-jp: 29109] 同時更新の制御

TVH51179 @ biglobe.ne.jp TVH51179 @ biglobe.ne.jp
2003年 2月 18日 (火) 17:04:00 JST


小林と申します。いつもお世話になっております。

RedHatLinux 7.2にて
Postgres-7.3.1を使用しております。

旧メーリングリストにて同様な質問−回答を参考にし、
色々試してみたのですが、どうもうまくいきません。

表に以下の値が入っているとします。
 a  b
------
 1  1
 2  1

この表に対してCの埋込SQLにて以下を行います。
(ここで、wk_a,wk_bはホスト変数とします)
EXEC SQL DECLARE test_cur CURSOR FOR SELECT * FROM 表;
EXEC SQL OPEN test_cur;
EXEC SQL FETCH IN CURSOR INTO :wk_a,:wk_b;
EXEC SQL UPDATE 表 set b=:wk_b+1 where a=:wk_a;・・・(1)
EXEC SQL FETCH IN CURSOR INTO :wk_a,:wk_b;
EXEC SQL UPDATE 表 set b=:wk_b+1 where a=:wk_a;・・・(1)
EXEC SQL COMMIT;

注:(1)のところで、bに設定する値はホスト変数を使用します。
このプログラムを2つ同時に走行した場合、(a,b)=(1,2),(2,2)となります。
(a,b)=(1,3),(2,3)を得るためにはどのようにすれば良いでしょうか?

もし、ロックを使用する場合は行ロックにて行いたいと思っております。

また、
他トランザクションで更新されたデータを(再定義なしで)カーソルが
保存しているデータに反映させることはできないのでしょうか?
さらに、FETCH時に行ロックをかけることは出来るのでしょうか?

可能な限りカーソルを使用したいのですが、不可能であれば、
カーソルでなくても構いません。
よろしくお願いいたします。

−−−−−−−−−−−−−−−−−−−
小林 克彦(TVH51179 @ biglobe.ne.jp


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