管理nHibernate

时间:2017-11-02 05:43:27

标签: c# 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();
        }
    }

1 个答案:

答案 0 :(得分:2)

你可以这样做:

    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 之外,以便您可以在其外部调用其事务回滚。