Frage

ich den folgenden Code haben, die in einer Transaktion. Ich bin mir nicht sicher, wo / wenn ich meine Arbeitseinheit werden commiting.

Ein Zweck habe ich erwähnt nicht, welche Art von Respoistory ich verwende - zB. Linq to SQL-, Entity Framework 4, NHibernate, etc.

Wenn jemand weiß, wo, können sie bitte erklären, warum sie gesagt haben, wo? (Ich versuche, das Muster durch Beispiel (e) zu verstehen, im Gegensatz zu nur meinen Code an der Arbeit).

Hier ist, was ich habe: -

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();
}
War es hilfreich?

Lösung

Commit auf # 4, nachdem alle Vorgänge bei allen Repositories gemacht werden. Wenn Sie im Voraus verpflichten, die nach diesem Anruf vorgenommenen Änderungen sind nicht verpflichtet.

Andere Tipps

Ein guter Punkt für die Beantwortung dieser Frage ausgehend ist die Definition der Arbeitseinheit von Patterns of Enterprise Architecture ( http://martinfowler.com/eaaCatalog/unitOfWork.html ):

  

führt eine Liste der Objekte, die von einer Geschäftstransaktion betroffen und koordiniert von Änderungen der Schreiben und der Auflösung von Concurrency Probleme.

Die Grenzen der Arbeitseinheit werden durch die Grenzen Ihrer Geschäftstransaktion definiert - in diesem Fall der mit den Grenzen der Datenbanktransaktion ist ein Synonym für (aber im Fall einer langen laufenden Geschäftstransaktion, dass Spannweiten mehr Anforderungen, die möglicherweise sein, den Fall nicht).

Arbeits rückwärts aus der obigen Definition und basierte auf meinem Verständnis des Teils des Codes angezeigt, sollten Sie die Einheit der Arbeit am Ende des Geschäftsvorfalles (# 4) begehen.

Als Nebenwirkung der Datenbank Transaktionstive immer weniger sein sollte als der Umfang Ihrer UOW (das heißt den tx Umfang befindet sich zwischen dem Aufruf von UoW.Begin () und UoW.Commit ()). Wenn Spannweiten Ihrer UOW mehr Datenbank-Transaktionen, die Sie eine kompensierende Transaktion „Neuverteilung“ die UOW verwenden würden, wenn eine der inneren Transaktionen fehlgeschlagen. In diesem Fall und vor allem, wenn Ihr UOW wird seine eigene Datenbank Transaktionsgrenzen bei UoW.Begin () und UoW.Commit () zu schaffen würde ich den Transaktionsbereich entfernen, da dies einfach ist unnötigen Lärm zu dem Code hinzugefügt wird.

Unter der Annahme, dass Ihre Datenspeicher-IDs zuweist, müssen Sie # 1 (mit NHibernate Sie sollten auch bündig) begehen, dann am Ende # 4.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top