9

我有以下代码在交易中。我不确定我应该在哪里/何时提交我的工作单元。

故意地,我没有提到我正在使用什么类型的 Respoistory - 例如。Linq-To-Sql、Entity Framework 4、NHibernate 等

如果有人知道在哪里,他们能否解释一下他们为什么说,在哪里?(我试图通过示例来理解模式,而不是仅仅让我的代码工作)。

这就是我所拥有的:-

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

3 回答 3

3

回答这个问题的一个很好的起点是企业架构模式中工作单元的定义(http://martinfowler.com/eaaCatalog/unitOfWork.html):

维护受业务事务影响的对象列表,并协调更改的写入和并发问题的解决。

工作单元的边界由业务事务的边界定义——在这种情况下,它与数据库事务的边界同义(但在跨越多个请求的长时间运行的业务事务的情况下,可能不是案子 )。

从上面的定义开始,根据我对所示代码的理解,您应该在业务事务结束时提交工作单元(#4)。

顺便说一句,您的数据库事务范围应始终小于 UoW 的范围(即 tx 范围位于对 UoW.Begin() 和 UoW.Commit() 的调用之间)。如果您的 UoW 跨越多个数据库事务,如果其中一个内部事务失败,您将使用补偿事务来“重新平衡”UoW。在这种情况下,特别是如果您的 UoW 在 UoW.Begin() 和 UoW.Commit() 创建它自己的数据库事务边界,我会删除事务范围,因为这只会给代码添加不必要的噪音。

于 2010-03-30T00:07:59.913 回答
0

在对所有存储库进行所有操作后,在 #4 处提交。如果您事先提交,则不会提交在该调用之后所做的更改。

于 2010-03-23T14:00:34.527 回答
0

假设您的数据存储正在分配 id,您必须提交 #1(使用 NHibernate,您甚至应该刷新),然后在最后提交 #4。

于 2010-03-29T23:18:48.623 回答