[pgsql-jp: 34516] Re: データ登録時の重複チェックについて

Tietew tietew @ tietew.net
2004年 12月 21日 (火) 20:13:36 JST


On Tue, 21 Dec 2004 19:54:34 +0900
In article <200412211049.iBLAnfvc015830 @ uxdcc002.daikodenshi.co.jp>
[[pgsql-jp: 34514] Re: データ登録時の重複チェックについて]
ngy.yt @ daikodenshi.co.jp wrote:

> >> Webアプリケーションで、商品の登録をさせようとしているのですが、一人の人が同日に
> >> 同じ商品を登録できないよう、テーブルを「EXCLUSIVE MODE」でロックをかけ、チェッ
> >> クを行っています。
> >> チェック方法は下記の通りです。
> >> 	BEGIN
> >> 	LOCK TABLE goods IN ACCESS EXCLUSIVE MODE
> >
> >ACCESS EXCLUSIVE MODE だと単純 SELECT までブロックしてしまうので 
> >EXCLUSIVE MODE のロックならそんなに処理は遅くならないと思います。
> 
> EXCLUSIVE MODEのロックですと、SELECTが流れてしまいますので、ユーザの方が登録
> ボタンをダブルクリックした場合に、二重登録されてしまう恐れがありましたので、ACCESS 
> EXCLUSIVE MODEでロックする方法を取りました。

ええと。そのような場合でも LOCK TABLE でブロックするので大丈夫で
はないですか?


           プロセス1              プロセス2
              |                     |
         [ 更新ボタン ]              |
              |                [ 更新ボタン ]
         [ BEGIN      ]              |
              |                [ BEGIN      ]
         [ LOCK TABLE ]              |
              |                [ LOCK TABLE ] <== ここでblock
         [ SELECT     ]              |
              |                     |
         [ INSERT     ]              |
              |                     |
         [ COMMIT     ]              |        <== ロックが外れる
              |                [ SELECT     ]
              ◎                     |
                                  重複検出
                                     |
                                [ ROLLBACK   ]
                                     |
                                     ◎

登録処理の時に重複チェック SELECT の前に必ず LOCK TABLE を通るよ
うにすれば ACCESS EXCLUSIVE MODE を使う必要はありません。
EXCLUSIVE MODE で十分です。


―[ Tietew ]――――――――――――――――――――――――――――
Mail: tietew @ tietew.net / tietew @ raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA




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