我有以下代码是在事务中。我不知道在哪里/当我应该commiting工作我单位。

在目的,我还没有提到我使用什么类型的Respoistory的 - 例如。 LINQ到SQL中,实体框架4,NHibernate的等

如果有人知道,他们可以请解释为什么他们纷纷表示,在哪里? (我试图理解通过实例(S模式),而不是仅仅让我的代码工作)。

下面就是我的了: -

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的(即,TX范围所在的呼叫到UoW.Begin()和UoW.Commit()之间)的范围。如果您UOW跨越多个数据库事务你可以使用一个补偿交易“再平衡”的UOW如果内部交易的一个失败。在这种情况下,特别是如果你的UOW是建立在UoW.Begin()和UoW.Commit()它自己的数据库事务的边界我会删除事务范围,因为这仅仅是增加不必要的噪声代码。

假设你的数据存储被分配ID,则必须执行#1(与NHibernate你应该甚至冲洗),然后在最后#4。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top