我正在尝试使用NHibernate的事务控制和FlushMode选项来实现某种嵌套事务行为,但是在阅读太多之后事情变得有点混乱,所以我在下面列出的事实的任何确认都非常有用。< / p>
我想要的是打开一个在小事务中分裂的大事务。想象一下以下场景:
我想看看NH将INSERT和TX2 UPDATE发送到数据库,只是忽略了回滚的TX3。
我尝试使用FlushMode = Never并且只在需要正确的Begins / Commits / Rollbacks之后才刷新会话,但NH总是使用对象的最终状态更新数据库,与提交和回滚无关。 这是正常的吗?使用FlushMode = Never?
时,NH是否真的忽略了事务控制我还尝试使用FlushMode = Commit并打开嵌套事务,但我发现,因为ADO.NET,嵌套事务实际上总是相同的事务。
请注意,我并没有尝试实现“全有或全无”的行为。我正在寻找一种保存点的工作方式。 NH有没有办法(保存点)?
提前谢谢。
菲利普
答案 0 :(得分:7)
只是不要永远打开这个问题,我会发布我们采用的解决方案。
我们有一个像容器这样的工作单元来管理嵌套的事务行为。根据我们想要的治疗方式,它会创建(或不创建)新会话。例如:
重要的是要说这个UoW操作的“事务”不是直接的NH(ADO.NET)事务。我们创建了一个事务的抽象,因此如果我们的事务可能被提交或回滚,操作代码会“投票”,但实际操作只会在所有内容的最后发生,基于所选的错误策略。
我们知道这种用法并不常见,只适用于特定的场景(在我们的例子中,它是一个带批处理的集成场景),所以我现在发布代码。如果有人认为这个实现可以提供帮助,请给我发一条消息,我很乐意分享这些代码。
此致
菲利普
答案 1 :(得分:1)
NHibernate不支持嵌套事务。每个ISession最多只能有一个活动事务。我不确定你是什么;重新尝试完成,因为你的示例场景对我没有意义。插入后提交事务1将产生相同的效果。