J'ai une routine qui met à jour mon entité commerciale. La mise à jour implique environ 6 tables différentes. Toutes les commandes sont en cours d'exécution dans une transaction.Comment éviter ces blocages?
Récemment, j'ai dû ajouter du code dans la routine qui accède à une table de recherche à partir de la base de données. Le code de recherche existait déjà dans un autre objet métier, j'ai donc utilisé cet objet métier. Par exemple:
Using tr As DbTransaction = myConnection.BeginTransaction()
ExecuteCommand1(tr)
ExecuteCommand2(tr)
If myLookupTable.GetLookupTable().FindById(id).HasFlagSet Then
ExecuteCommand3(tr)
End If
End Using
Toutefois, l'objet métier de la table de correspondance est bloqué/deadlocks. Je pense que c'est parce qu'il n'a pas de référence à la transaction utilisée par la routine d'origine. Après avoir fait des recherches, j'ai tenté de mettre la logique de la table de recherche dans sa propre transaction en réglant le IsolationLevel
sur ReadUncommitted
. Cela m'a donné les résultats que je désirais. Cependant, après de plus amples recherches, je suis maintenant en train de deviner si j'ai implémenté cela correctement.
En supposant qu'une référence à la transaction active n'est pas disponible pour mon objet de table de recherche, ce que j'ai décrit est-il considéré comme la meilleure pratique? Je sens que je pourrais manquer quelque chose.
Est-ce que command1 ou command2 fait quelque chose avec le lookuptable? –
Non, ils ne le font pas. Ils ne lisent même pas. Ils fonctionnent avec des tables qui ont un FK à la table de recherche cependant.Rien de tout cela ne suggère intuitivement un problème de verrouillage. –