2017-11-02 5 views
3

クラスCでA()、B()、mainFunction()という名前のメソッドがあるとします。mainFunction()ではA()メソッドとB()メソッドの両方を実行する必要がありますが、 ()およびcommitTransaction()を呼び出します。 B()にエラーが発生した場合、A()のトランザクションは引き続きコミットされますか?はいの場合、どうすればこの問題を解決できますか?nHibernateのネストされたトランザクションを管理する

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(); 
     } 
    } 

基本的に私はmainFunctionのためのグローバル変数としてISessionを作っ:事前

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

     public void mainFunction() 
     { 
      A(); 
      B(); 
     } 
    } 
+0

[NHibernateでネストされたトランザクションを実行するにはどうすればいいですか?](https://stackoverflow.com/questions/1192111/how-do-i-do-nested-transactions-in-nhibernate) – Najera

答えて

2

のおかげであなたはこれを行うことができます。次に、Function AまたはFunction Bのいずれかのエラーが発生した場合は、データベースに変更を保存せずにトランザクションをロールバックできます。

コミットトランザクションを呼び出さない限り、データベースに変更を保存せずに、機能Aまたは機能B内でコースISession.EvictまたはISession.Updateを使用することができます。

ここでの考え方は、取引をロールバックすることができるように、取引をすべてファンクションAおよびBの外に置くことです。

+0

申し訳ありませんが、私は、すべての機能を開始しコミットし、ネストされたトランザクションを実行する必要があります。私はカウンタを実装し、それが最後のcommitTransactionかどうかをチェックするためにnHibernateのbeginTransaction()とcommitTransaction()をオーバーライドできると思います。その場合は、トランザクション全体をコミットするだけです。しかし、どのクラスを上書きするのですか?私は混乱している –

+0

私は理解しています。しかし、関数Bがエラーをトリガした場合も、ロールバックする必要がありますか?だからグローバル化してみませんか?しかしそれは私の提案です。 –

+0

このdataAccessLayerを一度ご覧ください。従来の多くのエラーがありますが、私はあなたがその3つの方法で見て、私に示唆してほしいですか? ** https://codereview.stackexchange.com/questions/179334/dataaccesslayer-of-nhibernate/179346#179346** –

関連する問題