在 nHibernate 中管理嵌套事务



假设我在类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作为mainFunction的全局变量。然后,如果它在 Function AFunction B 上捕获错误,则可以回滚事务而不在数据库上保存任何更改。

当然,您可以在函数 A 或函数 B 中使用 ISession.EvictISession.Update,而无需在数据库上保存任何更改,除非您调用提交事务。

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

最新更新