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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top