我想我的架构中可能有我的工作单元设置错误。这是我目前拥有的(缩进以显示顺序):
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 和每个请求的会话有缺陷?有什么建议么?