累計
本日
昨日

採番ロジックあれこれ

実用的な業務システムであれば、完結した業務処理を識別する発注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

関連情報

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