【发布时间】:2012-10-23 05:51:30
【问题描述】:
我认为我的架构中的工作单元设置可能有误。这是我目前拥有的(缩进以显示顺序):
HttpRequest.Begin()
UnitOfWork.Begin()
Session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
在这里,我调用各种服务来使用 NHibernate 执行 crud。当我想对数据库进行更改(更新/保存)时,我调用此代码:
using (var transaction = unitOfWork.Session.BeginTransaction())
{
try
{
// These are just generics
ret = (Key)unitOfWork.Session.Save(entity);
transaction.Commit();
rb.unitOfWork.Session.Clear();
}
catch
{
transaction.Rollback();
rb.unitOfWork.Session.Clear();
rb.unitOfWork.DiscardSession();
throw;
}
}
当 HttpRequest 结束时,我执行以下步骤:
UnitOfWork.Commit()
Transaction.Commit() // This is my sessions transaction from the begin above
我遇到了能够回滚大批量进程的问题。因为我在我的 CRUD 层中提交我的事务,如上所示,我的事务不再处于活动状态,当我尝试在我的 UnitOfWork 中回滚时,它什么也不做,因为事务已经被提交。我在我的 CRUD 层中提交我的代码的原因是我可以尽可能快地保存我的数据,而不会锁定数据库太久。
对于上述情况,最好的行动方案是什么?我是否只是进行不提交批处理作业的特殊 CRUD 操作,而只是在我的工作结束时处理提交,还是我的逻辑与我的 UnitOfWork 和每个请求的会话有缺陷?有什么建议吗?
【问题讨论】:
标签: c# nhibernate unit-of-work session-per-request