J'ai une table de serveur SQL de clés de licence/numéros de série. La structure de la table est quelque chose comme;Affectation d'un numéro de série à un client à partir d'un groupe de numéros de série
[
RecordId int,
LicenceKey string,
Status int (available, locked, used, expired etc.)
AssignedTo int (customerId)
....
]
Grâce à mon application ASP.NET, lorsque l'utilisateur décide d'acheter une licence en cliquant sur le bouton accepter, je dois réserver une clé de licence pour l'utilisateur. Mon approche est comme, Sélectionnez top 1 licenceKey à partir de KeysTable Où Status = disponible Mise à jour KeysTable Définir l'état = verrouillé puis renvoyer la clé à l'application.
Mon problème est que deux threads asp.net accèdent au même enregistrement et retournent la même clé de licence. Selon vous, quelle est la meilleure pratique pour effectuer de telles tâches? Y a-t-il une approche bien connue ou un modèle à ce genre de problème? Où utiliser les instructions lock() si j'en ai besoin? J'utilise Sql Server 2005, les procédures stockées pour l'accès aux données, une DataLayer, une BusinessLayer et une interface graphique Asp.Net.
Merci
Que se passe-t-il si je veux renvoyer l'ensemble de l'enregistrement au lieu du champ licenceKey? Puis-je utiliser quelque chose comme ceci: Update TOP (1) KeysTable SET Status = "verrouillé" SELECT * FROM KeysTable OÙ licenceKeyId = INSERTED.licenceKeyId Merci – UmutKa
Non, vous ne pouvez pas faire exactement. Je mettrai à jour ma réponse pour montrer comment c'est fait. – LukeH
Très bien, mais malheureusement j'ai un déclencheur sur cette table. Donc ça ne me laisse pas utiliser OUTPUt sans INTO. Si j'utilise INTO alors cela sera-t-il encore une opération atomique et retournera-t-il le résultat attendu ou devrais-je utiliser l'isolation de transaction? – UmutKa