Membership API
ASP.NET 2.0には認証用のライブラリとしてMembership APIがあります。
標準ではSQL Server用のProviderが用意されていますが。
そのソースはダウンロード出来るし、処理実態はほぼストアドプロシージャなので、ちょっとその中身を覗いてみました。
ちなみにソースのダウンロードはこちらから。
http://download.microsoft.com/download/a/b/3/ab3c284b-dc9a-473d-b7e3-33bacfcc8e98/ProviderToolkitSamples.msi
で、ロック周りの処理なんかは、さすがにちゃんと細かくやっていますね(・∀・)
例えば登録系はこんな感じになっていたり。
- トランザクション開始
- IF ( EXISTS ( SELECT ... FROM ... WITH ( UPDLOCK, HOLDLOCK ) WHERE Id = @Id ) ) 既存
- INSERT ... ( Id, ... ) VALUES ( @Id, ... )
- トランザクション終了
重複登録についてもエラー・例外で処理するのではなく、ロックにより重複INSERTが発生しないようになっています。
重複対策を簡単にやる場合には、例外を拾ってエラー番号をチェックするという手を取る場合もありますけど。
そもそも、世の中にはこういうエラー対策の甘い(エラー対策をしていない)Webシステムなんかも結構ありそうで恐いですが(´・ω・`)
レアケースでロストアップデートが発生したり、デッドロックが発生するような。
システムのトランザクションストラテジーについては、素人が適当にやって良い項目では無いわけで。
組み込みやシステムプログラムにおけるスレッドの排他制御なんかと同じで。
#排他がいい加減な組み込みプログラムなんてあり得ないし((((;゚Д゚)))ガクガクブルブル
ちゃんと問題の発生確率や影響度を検討して、その上でパフォーマンスの観点からロストアップデートを許可するとか、そこまで考えているなら良いんですけどね(´ω`)