採番ロジックあれこれ

実用的な業務システムであれば、完結した業務処理を識別する発注IDや予約番号などのユニークな番号が必要であり、この番号はシステムで発行(採番)する必要がある。番号の発行方法には、次のような方法がある。

案1 グローバルユニークID(GUID:Globally Unique Identifier)を発行する
案2 DBのシーケンス番号を利用する
案3 プログラムで連番を発行する

案1は.NETのライブラリを使って32桁の番号を自動で発行してもらう方法である。簡単に実装できるメリットがあるが、番号自身に意味を持たせることができないため、発行された順序や種別がわからないという欠点がある。システム内部で管理するためのIDとしては有効できるが、エンドユーザの画面に表示する情報としてはお勧めできない。

GUIDの例 {676A3Q2D-07E4-4121-G3B2-809147DFD0B9}

案2は、データベースのシーケンス番号を使って、番号の発行をデータベースに任せる方法である。番号はデータベースにINSERTしたときに発行されるので、開発者はプログラミング不要である点がメリットである。欠点はコミットしないと番号が発行されない点である。業務上、番号をユーザに知らせる必要がないのであればこの方法が楽であろう。番号はデータベース側で自動的に発行されるので、発行された番号をユーザに伝えるのであれば、コミット完了後に番号を取得する仕組み実装しなければならない。

案3は採番ロジックを自作する方法である
ID番号を先に発行して画面に表示させたいというような要件に適している。もっとも新しい発行済みの番号だけデータベースに記録しておき、発行したら1つずつインクリメントしてデータベースを更新するしくみである。実装するには、同時アクセスされても同じ番号が発行されない工夫が必要である。

下記は採番ロジックのサンプルである。ポイントは、このクラスがNotInheritableとSyncLockを使っている2点である。前者は継承できないことを指定して、GetOrderIDメソッドがこのクラスでしか実行されないように制限している。後者はクラスに一つしか存在しないsyncRootオブジェクトをロックすることによって、マルチスレッドでも同時に実行されないように制限している。両者の制限があることによって、番号の取得と採番テーブルのUPDATEは絶対に同時に実行されない。したがって、同じ番号が複数のユーザに発行されることを防いでいるのである。

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/268

関連情報

・Microsoft JScript 実行時エラー:オブジェクトを指定してください。
・このログインで要求されたデータベースXXX を開けません。ログインに失敗しました。ASPNET はログインできません
・Logging Application Blockのトラブルシューティング
・IISのログ出力先
・このログインで要求されたデータベースXXX を開けません。ログインに失敗しました。ASPNET はログインできません
・C# 3.5 yieldの読み方
・ASP.NET サーバーサイドのイベント処理の順番
・ASP.NETのWebページでグーグルアドセンスを貼り付ける方法
・IIS メタベースにアクセスできませんでした
・VSSで管理されているプロジェクトは、ファイルの名前の変更や移動は極力行わない方が良い
・Oracle 9.2へOLE DB接続する方法
・単体テストのデータ
・この行は既に別のテーブルに属しています
・データベースのバージョンは 655 なので、開けません。
・証明書ストアでマニフェスト署名用の証明書が見つかりません。
・次のモジュールは最適化を有効にされて、またはデバッグ情報なしでビルドされました
・String.Concatメソッドを使った文字列の連結
・ファイルの存在をチェックする
・テキストファイルをロードし文字列を読み込むサンプル
・任意の数の引数を受け取るメソッド

Copyright(C) 2007 アーキテクト360 Allrights reserved.