[pgsql-jp: 27667] Re: テーブルの同時更新を防ぐには?

ISHIDA Akio iakio @ pjam.jpweb.net
2002年 10月 17日 (木) 20:55:33 JST


こんにちは。石田@苫小牧市と申します。

On Thu, Oct 17, 2002 at 06:20:58PM +0900, matsuda wrote:
> エムソフトの松田と申します。
> 
> 開発環境
> rethatLinux7.2
> postgres7.2.2
> 
> PHPを用い、WebからDBを更新/登録しています。
> 登録の流れは以下のようになっております。
> 
> ------------------------------------------------------------
> Aテーブルから今日の連番取得(日が変わると1に戻る)
>> PHP側で日付+連番の登録コード作成
> (例)200201010001
>> Aテーブルに連番を+1して再登録
>> 作成した登録コード(プライマリキー)でBテーブルに新規登録
> ------------------------------------------------------------
> 
> という流れなのですが、同時アクセステスト時に、
> 数人一斉に「登録」ボタンを押すと、
> ERROR: Cannot insert a duplicate key into a unique index.
> と言うメッセージが表示されます。
> これは既に登録しているプライマリキーで再度登録しようとしているため
> だと思うのですが、複数人同時アクセス時にこのエラーを起こさせない
> 良い方法は無いでしょうか?(なるべく上記の処理の流れを変えずに・・・)
> biginやcommitなど試みたのですが、やはり結果は変わりません。

このようなケースでは、単に begin や select for update ではなく、
明示的にテーブルロックする必要があります。

begin;
lock table <<tablename>>;
select ...
insert ...
commit;

AccessExclusiveMode がベストなロックモードかどうかは
ちょっと自身がありません。

-- 
ISHIDA Akio




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