質問

トランザクション内に次のコードがあります。作業単位をいつどこでコミットすればよいのかわかりません。

意図的に、私が使用している Respoistory の種類については触れていません。Linq-To-SQL、Entity Framework 4、Hibernate など。

誰かが場所を知っている場合、なぜどこで言ったのか説明してもらえますか?(コードを単に機能させるのではなく、例を通してパターンを理解しようとしています)。

これが私が持っているものです:-

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();
}
役に立ちましたか?

解決

すべてのリポジトリへのすべての操作が行われた後に、

は#4にコミット。あなたは事前にコミットする場合は、その呼び出しの後に行われた変更はコミットされません。

他のヒント

この質問に答えるための良い出発点は、(エンタープライズアーキテクチャのパターンからの作業ユニットの定義ですhttp://martinfowler.com/eaaCatalog/unitOfWork.html の):

  業務トランザクションによって影響を受けるオブジェクトと座標の変化と並行性の問題の解決を書き出すのリストを管理します。

は、作業のあなたのユニットの境界は、ビジネストランザクションの境界によって定義されています - データベーストランザクションの境界(と同義であり、この場合ではなく、長い実行されているビジネストランザクションの場合とそれかもしれスパン複数のリクエストない)場合がます。

作業上の定義から後方に示したコードの一部の私の理解に基づいて、ビジネス・トランザクション(#4)の最後に作業単位をコミットする必要があります。

はさておき、データベース・トランザクション・スコープは常にUOWの範囲(UoW.Begin()とUoW.Commit()への呼び出しの間、すなわちTXスコープが存在する)未満であるべきです。あなたのUOWスパン複数のデータベース・トランザクションの場合、内部トランザクションの1つが失敗した場合は、「リバランス」UOWに補正トランザクションを使用します。この例では、特にあなたのUOWが、これは単にコードに不要なノイズを加えているように私は、トランザクション・スコープを削除しますUoW.Begin()とUoW.Commit()でそれ自身のデータベーストランザクション境界を作成しているか。

あなたのデータストアがIDを割り当てると仮定すると、あなたは、エンド#4で、(あなたも、フラッシュすべきNHibernateので)1位にコミットする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top