我可以在NHibernate中进行嵌套事务,我该如何实现它们?我正在使用SQL Server 2008,所以支持肯定在DBMS中.
我发现如果我尝试这样的事情:
using (var outerTX = UnitOfWork.Current.BeginTransaction())
{
using (var nestedTX = UnitOfWork.Current.BeginTransaction())
{
... do stuff
nestedTX.Commit();
}
outerTX.Commit();
}
Run Code Online (Sandbox Code Playgroud)
然后到outerTX.Commit()事务处理变为非活动状态时,会在会话AdoTransaction上产生ObjectDisposedException.
因此我们应该创建嵌套的NHibernate会话吗?或者是否有其他类我们应该使用它来包装事务(我听说过TransactionScope,但我不确定那是什么)?
我现在正在使用Ayende的UnitOfWork实现(感谢Sneal).
原谅这个问题的任何天真,我还是NHibernate的新手.
谢谢!
编辑:我发现你可以使用TransactionScope,例如:
using (var transactionScope = new TransactionScope())
{
using (var tx = UnitOfWork.Current.BeginTransaction())
{
... do stuff
tx.Commit();
}
using (var tx = UnitOfWork.Current.BeginTransaction())
{
... do stuff
tx.Commit();
}
transactionScope.Commit();
}
Run Code Online (Sandbox Code Playgroud)
但是我对此并不是很兴奋,因为它锁定了我们使用SQL Server,而且我发现如果数据库是远程的,那么你必须担心启用MSDTC ...还有一个组件要去错误.嵌套事务在SQL中是如此有用和容易,我认为NHibernate可以通过某种方式模拟相同的...
我试图将NHibernate与未与NHibernate映射的遗留实体一起使用.有时这意味着我需要手动将NHibernate数据刷新到数据库,这样当我尝试将遗留实体与NHibernate映射实体连接时,我不会收到外键异常.
当这发生在需要回滚的事务中时会发生问题.从NHibernate刷新的数据不会回滚.
我能做些什么吗?
UPDATE
仍然很好奇如何做到这一点 - 我不相信给出的任何答案都解决了这个问题.我需要调用Flush().问题是,如何回滚已刷新的数据?