在该行下面的代码,我应该将我的工作单位?
-
21-09-2019 - |
题
我有以下代码是在事务中。我不知道在哪里/当我应该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。
不隶属于 StackOverflow