- PR -

枝番採番時の排他制御

1
投稿者投稿内容
あっとリオン
会議室デビュー日: 2008/02/24
投稿数: 1
投稿日時: 2008-02-24 17:30
伝票データ登録時に伝票番号単位に枝番を採番する必要がある為、
採番テーブルを作成しようとしたところ、

「枝番の採番は独自の採番体系があるわけでもなく単純にインクリメント
しているだけなので採番テーブルなど用いずにうまく排他制御をかけて採番して下さい。」

との指摘を受けてしまいました。
枝番のような単純な連番の場合には採番テーブルは必要ないのでしょうか。
枝番の採番時の排他制御のかけ方についてご教授いただければと思います。

■ 登録処理
・一回の呼び出しで1伝票分のデータを受取り、DBに登録処理する。
・伝票番号は呼び出し元より渡され、登録時には枝番のみ採番する。

■ 開発環境
・言語→java
・DB→Oracle
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2008-02-24 17:55
最初にテーブルに対してUロックを取得するのが確実な手法です。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-02-24 18:42
オラクルならSEQUENCEオブジェクトを使えば番号の取得はできます
ただし連番は保障されない。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2008-02-24 20:41
枝番の採番には個々の伝票レコード単位でロックすれば十分なので、
テーブル単位より粒度の小さいロックを使え、という意味でしょう。

コード:

+------------+ +------------+
|伝票テーブル| |明細テーブル+
+------------+ +------------+
|番号(PK)    | |番号(PK,FK) |
+------------+ |枝番(PK)    |
                +------------+


というような構造のテーブルだとすると、

コード:

SELECT * FROM 伝票テーブル WHERE 番号 = ? FOR UPDATE
SELECT MAX(枝番) + 1 FROM 明細テーブル WHERE 番号 = ?


として、枝番の採番前にSELECT 〜 FOR UPDATEすればよいです。
1

スキルアップ/キャリアアップ(JOB@IT)