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

matsuda yumatuda @ msoft.co.jp
2002年 10月 18日 (金) 10:16:09 JST


おはようございます、エムソフト松田です。

沢山のご回答ありがとうございます。>ALL
今回は以下の石田さんの方法で対応いたしました。
具体的な流れとしましては、

------------------------------------------------------------
BEGIN;
LOCK TABLE Aテーブル;
↓
Aテーブルから今日の連番取得(日が変わると1に戻る)
↓
PHP側で日付+連番の登録コード作成
(例)200201010001
↓
Aテーブルに連番を+1して再登録
↓
COMMIT;
↓
作成した登録コード(プライマリキー)でBテーブルに新規登録
------------------------------------------------------------

と言う感じです。
この方法で、またテストを行った結果エラーは出ず、
全員が正しく登録できていることを確認いたしました。
体感速度的にも、LOCKするから少し待ち時間ができるかな?
と言う懸念があったのですが、特に問題はありませんでした。
最初のメールでBEGIN;とCOMMIT;は試した、と申しましたが、
どうやらロックモードが良くなかったようです。

あと、BIGIN→BEGINですね・・・お恥ずかしい(^^;
また、宜しくお願いいたします。

ISHIDA Akio <iakio @ pjam.jpweb.net> wrote:

> こんにちは。石田@苫小牧市と申します。
> 
> 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 メーリングリストの案内