LINQ-to-Sql lecture-écriture de test comme une seule opération
-
09-10-2019 - |
Question
Je Tasks
tableau: Id (PK), TaskName, Status
Statut est l'un:. Queued , Occupé , complet
Je veux utiliser plusieurs threads pour traiter les tâches, et que je dois pouvoir le faire en une seule opération:
var task = db.Tasks.FirstOrDefault(t=>t.Status == (byte) TaskStatus.Queued);
task.Status = (byte) TaskStatus.Busy;
db.SubmitChanges();
Il est évident que si l'opération n'est pas atomique que je réglons les problèmes de concurrence. Qu'est-ce que (le cas échéant) d'une manière destinée à faire ce qui précède à l'aide Linq-à-Sql?
Je sais que je peux le faire avec 1) storproc ou 2) db.ExecuteCommand("...")
ou 3) gérer le conflit with try/catch
- mais je veux être sûr qu'il n'y a pas une meilleure façon
Je sais qu'il est très question fondamentale, mais je ne pouvais pas trouver une réponse définitive à ce sujet.
La solution
Si vous êtes désireux d'être sûr que ce qui se passe dans la base de données atomiquement (quel que soit ce fil ou l'application appellent), vous devriez probablement le faire dans un sproc et verrouillage à un niveau approprié il. Le sproc doit récupérer et mettre à jour le dossier, puis relâchez et le retourner (Ack! Je ne veux pas dire la déclaration de return
TSQL, mais vous savez que je select
moyenne, je confiance!)
L2S appelle juste le sproc et revient une tâche à travailler, déjà fixé comme Busy
. L2S ne sait ni (soins) quoi / comment les choses ont été verrouillées -. Et ne peuvent donc pas les questions compliquer et d'introduire plus de chances pour les interblocages