C# 在nHibernate中管理嵌套事务

C# 在nHibernate中管理嵌套事务,c#,nhibernate,C#,Nhibernate,假设我在类C中有一个名为a()、B()和mainFunction()的方法。在mainFunction()中,我必须运行两个方法a()和B(),但都有beginTransaction()和commitTransaction()。如果B()中发生任何错误,那么A()中的事务是否仍将提交?如果是,我如何解决这个问题?提前谢谢 public class C { public void A() { //beginTransaction

假设我在类C中有一个名为a()、B()和mainFunction()的方法。在mainFunction()中,我必须运行两个方法a()和B(),但都有beginTransaction()和commitTransaction()。如果B()中发生任何错误,那么A()中的事务是否仍将提交?如果是,我如何解决这个问题?提前谢谢

  public class C
    {
        public void A()
        {
            //beginTransaction
            //functions
            //commitTransaction
        }
        public void B()
        {
            //beginTransaction
            //functions
            //commitTransaction
        }

        public void mainFunction()
        {
            A();
            B();
        }
    }
您可以这样做:

    public void A(ISession objSession)
    {
        //functions
    }
    public void B(ISession objSession)
    {
        //functions
    }

    public void mainFunction()
    {  
        ISession objSession = base.GetCurrentSession;
        using (ITransaction transaction = objSession.BeginTransaction)
        {
         try 
         {
           A(objSession);
           B(objSession);

           //If successful for everything:
           objSession.Flush();
           objSession.Commit();
         }
         catch (Exception ex)
         {
           transaction.Rollback();
         }
    }
基本上,我将ISession作为main函数的全局变量。然后,如果它在
函数A
函数B
上捕获到错误,则可以回滚事务,而不保存对数据库的任何更改

当然,您可以在函数A或函数B中使用
ISession.execute
ISession.Update
,而不保存对数据库的任何更改,除非调用提交事务


这里的想法是将事务放在所有函数A和B的外部,这样您就可以在其外部调用其事务回滚。

对不起,先生,但我必须将begin和commit放在每个函数中,并执行嵌套事务。我想我可以重写nHibernate的beginTransaction()和commitTransaction(),以实现计数器并检查它是否是最后一个commitTransaction。如果是,则只提交整个事务。但是要覆盖哪个类呢?我很困惑,我明白了。但是如果函数B触发错误,您也要回滚它吗?那么为什么不让它全球化呢?但这只是我的建议。你能看一下这个dataAccessLayer吗。有很多传统的错误,但我想让你看看这三种方法,并建议我?NHibernate不支持嵌套事务。您需要了解nhibernate的工作单元概念。事务不应在函数内部随意启动。事务应在工作单元内启动。可能重复