不应该';t nHibernate ISession.BeginTransaction()在事务已打开时失败?

不应该';t nHibernate ISession.BeginTransaction()在事务已打开时失败?,hibernate,nhibernate,Hibernate,Nhibernate,我知道这类问题会引发激烈的战争。就我个人而言,我是nHibernate的超级粉丝,我意识到没有什么ORM是完美的。我只是想确定这是否有一个我不知道的原因,或者这是否是一个存在的设计缺陷,因为更改它会破坏现有的代码 以下是我描述的行为: 假设我有一个名为session的现有ISession,下面的代码不应该在第三行抛出异常,因为nHibernate不支持嵌套事务 ITransaction tx = null; tx = session.BeginTransaction(); tx = sessio

我知道这类问题会引发激烈的战争。就我个人而言,我是nHibernate的超级粉丝,我意识到没有什么ORM是完美的。我只是想确定这是否有一个我不知道的原因,或者这是否是一个存在的设计缺陷,因为更改它会破坏现有的代码

以下是我描述的行为:

假设我有一个名为
session
的现有
ISession
,下面的代码不应该在第三行抛出异常,因为nHibernate不支持嵌套事务

ITransaction tx = null;
tx = session.BeginTransaction();
tx = session.BeginTransaction();
如果我们假设当前线程上没有打开其他事务,那么对
BeginTransaction()
的第一次调用确实会开始一个事务。但是,第二个仅返回现有事务。它给人的印象是支持嵌套事务。这个命名法不好吗

创建两种方法是否更有意义?一个用于抓取现有事务,或者在开发人员不关心的情况下创建一个事务(如果不存在),另一个方法专门创建新事务,但无法创建时失败

这个问题是关于nHibernate的,但也许这也适用于Hibernate。

这篇文章包含到的链接,其中提供了处理这种情况的代码。(免责声明:我没有尝试过该代码,但之前在研究其他问题时遇到过。)