Question

Je le code suivant qui est dans une transaction. Je ne sais pas où / quand je serais mon unité commiting de travail.

Le but, je ne l'ai pas mentionné ce type de Respoistory j'utilise - par exemple. LINQ to Sql, Entity Framework 4, NHibernate, etc.

Si quelqu'un sait où, peuvent-ils s'il vous plaît expliquer pourquoi ils l'ont dit, où? (Je suis en train de comprendre le modèle par exemple (s), plutôt que de simplement obtenir mon code de travail).

Voici ce que j'ai: -

using
(
    TransactionScope transactionScope =
        new TransactionScope
        (
            TransactionScopeOption.RequiresNew,
            new TransactionOptions
                { IsolationLevel = IsolationLevel.ReadUncommitted }
        )
)
{
    _logEntryRepository.InsertOrUpdate(logEntry);
    //_unitOfWork.Commit();  // Here, commit #1 ?

    // Now, if this log entry was a NewConnection or an LostConnection,
    // then we need to make sure we update the ConnectedClients.
    if (logEntry.EventType == EventType.NewConnection)
    {
        _connectedClientRepository.Insert(
            new ConnectedClient { LogEntryId = logEntry.LogEntryId });
        //_unitOfWork.Commit(); // Here, commit #2 ?
    }

    // A (PB) BanKick does _NOT_ register a lost connection,
    // so we need to make sure we handle those scenario's as a LostConnection.
    if (logEntry.EventType == EventType.LostConnection ||
        logEntry.EventType == EventType.BanKick)
    {
        _connectedClientRepository.Delete(
            logEntry.ClientName, logEntry.ClientIpAndPort);
        //_unitOfWork.Commit(); // Here, commit #3 ?
    }

    _unitOfWork.Commit(); // Here, commit #4 ?
    transactionScope.Complete();
}
Était-ce utile?

La solution

Engagez à # 4 après toutes les opérations à tous les dépôts sont faits. Si vous vous engagez à l'avance, les modifications apportées après cet appel ne sont pas engagés.

Autres conseils

Un bon point de départ pour répondre à cette question est la définition de l'unité de travail de modèles d'architecture d'entreprise ( http://martinfowler.com/eaaCatalog/unitOfWork.html ):

  

tient à jour une liste des objets touchés par une transaction commerciale et coordonne l'écriture sur les changements et la résolution des problèmes de concurrence.

Les limites de votre unité de travail sont définies par les limites de votre transaction commerciale - dans ce cas, qui est synonyme avec les limites de la transaction de base de données (mais dans le cas d'une transaction commerciale à long en cours d'exécution couvrant plusieurs demandes qui peuvent Dans le cas contraire).

Travailler en arrière à partir de la définition ci-dessus et basée sur ma compréhension du morceau de code indiqué, vous devez engager l'unité de travail à la fin de la transaction commerciale (# 4).

En aparté, vos champs de transaction de base de données doit toujours être inférieure à la portée de votre UOW (à savoir la portée de tx réside entre l'appel à UoW.Begin () et UoW.Commit ()). Si votre UOW couvre les transactions de base de données multiples que vous utilisez une opération de compensation de « rééquilibrer » la UOW si l'une des opérations intérieures a échoué. Dans ce cas, et surtout si votre UOW crée ses propres limites il des transactions de base de données à UoW.Begin () et UoW.Commit () Je supprimerais la portée de la transaction, car cela ajoute simplement le bruit inutile au code.

En supposant que votre magasin de données est ids assignant, vous devez engager # 1 (avec NHibernate vous devriez même flush), puis à la fin # 4.

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