Nhibernate 如何在没有嵌套事务的情况下使用显式事务

Nhibernate 如何在没有嵌套事务的情况下使用显式事务,nhibernate,Nhibernate,好的,即使是读操作。 但假设我有以下情况: public Employee GetEmployeeByName(string name) { using (ITransaction tx = CurrentSession.BeginTransaction()) { return dao.GetEmployeeByName(name); } } publ

好的,即使是读操作。
但假设我有以下情况:

public Employee GetEmployeeByName(string name)
        {
            using (ITransaction tx = CurrentSession.BeginTransaction())
            {
                return dao.GetEmployeeByName(name);
            }
        }

    public void SaveNewEmployee(Employee employee)
    {
        using (ITransaction tx = CurrentSession.BeginTransaction())
        {
            if (GetEmployeeByName(employee.Name) != null)
            {
                throw new ArgumentException("employee with same name found");
            }
            CurrentSession.Save(employee);
        }
    }
这实际上会引发异常,因为。
我怎样才能避开这件事

编辑

是一个比我接受的更好的解决方案…

通常,您可以通过使用工作单元模式来绕过它,在该模式中,您可以在打开会话的同时启动事务。也就是说在工作单元的开始。然后在工作单元结束时提交。

听起来不错。两个问题:1。有些请求没有数据库访问权限(例如,我广泛使用二级缓存)。你的方法会影响这些案例的绩效吗?2.何时回滚事务?在我的例子中考虑这两个函数。我将删除事务内容,并为每个事务添加一个try-catch块。在catch块中,我将回滚事务并继续抛出异常。现在我有一个问题,我回滚事务两次。@sJohnny,事务并不昂贵,所以我不必担心它()。对于2,您只需要在写操作的情况下回滚事务,因此只有在执行保存时在SaveNewEmployee中回滚才有意义。提供的链接没有说明事务是廉价的。它说,无论何时你去db,都建议使用它们。我的问题是,在不需要去db的情况下,是否应该使用它们,这篇文章没有涉及到这一点。至于2-足够公平。但是假设在上面的示例中SaveNewEmployee也调用SaveNewBlahRecord?然后呢?@sjonny,“正如前面提到的,数据库总是在事务中运行。而且,它们已经过大量优化以处理事务。”对于你的另一个问题,我认为你的架构可能需要一些调整。如果您想像那样公开所有这些Save方法,但不控制它们的入口点,那么我会让您的Save方法在异常的某个地方注册一个错误。然后,在工作单元管理器中,它可以检查是否存在任何错误,并提交或回滚事务。