ライセンスキー/シリアル番号のSQL Serverテーブルがあります。 テーブル構造は次のようなものです。私のASP.NETアプリケーションを介してシリアル番号プールからシリアル番号をクライアントに割り当てる
[
RecordId int,
LicenceKey string,
Status int (available, locked, used, expired etc.)
AssignedTo int (customerId)
....
]
ユーザーが受け入れるボタンをクリックし、ライセンスを購入することを決定したときに、私は、ユーザーのライセンスキーを確保する必要があります。 私のアプローチは次のようなものです KeysTableからトップ1を選択してください。ステータス=利用可能 更新キーセットステータス=ロック キーをアプリケーションに戻します。
私の懸念は、2つのasp.netスレッドが同じレコードにアクセスし、同じlicencekeyを返す場合です。 このような課題を実行するベストプラクティスは何と思いますか?この種の問題にはよく知られているaproachやパターンがありますか? lock()ステートメントが必要な場合はどこで使用しますか?
私はSql Server 2005、データアクセス用のストアドプロシージャ、DataLayerのBusinessLayerおよびAsp.Net GUIを使用しています。
おかげ
licenceKeyフィールドだけでなく、レコード全体を返したい場合はどうすればいいですか? アップデートTOP(1)KeysTable SETステータス= "ロック" SELECT * FROM KeysTable licenceKeyId = INSERTED.licenceKeyId おかげで – UmutKa
いいえ、あなたは正確にそれを行うことはできません。私はこのようなものを使用することができます。私はそれがどのように行われたかを示すために私の答えを更新します。 – LukeH
非常にいいですが、残念ながら私はこのテーブルのトリガーを持っています。だから私はINTOなしでOUTPUtを使うことはできません。私はINTOを使用する場合、それはまだ原子操作であり、私は期待している、または私はトランザクションの分離を使用する必要があります結果を返しますか? – UmutKa