1つのトランザクションで2つのDAOメソッドを管理する方法は?


12

インタビューで誰かが私に尋ねました:単一のトランザクションで2つのトランザクション/ダオ方法をどのように管理しますか。必要な機能:

  1. それらのいずれかが失敗した場合、両方の方法をロールバックする必要があります。
  2. 両方のメソッドは、単一のトランザクションで個別に接続して呼び出すことができます。
  3. 管理は、サービス層ではなくDAO層で行う必要があります。

私は思う:質問は春のトランザクション管理に関連しています。

回答:


12

まず、トランザクション管理は、多くのパフォーマンスオーバーヘッドが発生するため、DAO層ではなくサービス層で実行する必要があります(適切なトランザクション分離レベルと各メソッドでの伝播に対処するため)。また、作業単位の範囲は、データアクセス層ではなくサービス層からのものです。2つ以上のDAOを処理する必要があるビジネスプロセスの実行を想像してください。

インターネットでの議論の多くは、そのようにその方向にポイントがあり、ここでここここ

とにかく、インタビューなので質問をそのまま受け入れましょう。私の観点からは@Transactional、両方のメソッドでアノテーション(またはXML構成)を使用し、REQUIRED値を伴うトランザクション伝播で使用することになります。そのようにして、これらのメソッドのいずれかが呼び出され、以前のトランザクションが存在しない場合、新しいトランザクションが作成されます。

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}

同じトランザクションを意味しfoo()bar()共有し、1つが失敗した場合、別の1もロールバックしますか?明確化を提供できますか?
サティッシュパンディ

さて、各メソッドは独自の作業単位を宣言します。txは各メソッドの最後にコミットされ、それらのいずれかが例外をスローするとロールバックされます。
アロンソドミンゲス

だから@Transactional(propagation = REQUIRED)、伝播と@Transactionalサービス層にDAO層メソッドを追加する必要がありますが、DAO層に入れる@Transactional代わりにサービス層のみに入れると、違いは何ですか?
atishシンピ

propagation = REQUIREDトランザクションアノテーション伝播のデフォルト値であるため、記述する必要はありません。
ダニエルヒゲラス16

2

私の答えでは春とフレームワークを無視します。....関数パラメータを使用する基本的な考え方です。この概念は[ここにフレームワークを挿入]に適用できると確信しています。

2つのDAOメソッドの外部でコミット/ロールバックを処理する必要があります。2つのメソッドは、入力としてトランザクション/接続を取る必要があります。

擬似コード:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}

1つの質問:Tran t両方のメソッドでパラメーターとして渡す理由。説明をお願いできますか?
サティッシュパンディ

@Satish、質問(項目#1および#2)で、DAOメソッドは、独立してだけでなく依存的にも呼び出される柔軟性が必要であるため。ローカルスコープトランザクションを使用してmethod1内でコミットする場合、method2が呼び出される前にmethod1をすでにコミットしているため、method2で問題が発生した場合、ロールバックできません。
mike30

0

同じトランザクションで2つのメソッドが同時に独立して動作する可能性があるため、Propagation-Requiredを使用する必要があります。トランザクションを同じトランザクションで実行する必要がある場合は、最初のトランザクションを使用します。それ以外の場合は、独立して呼び出されると新しいトランザクションが作成されます。間違っている場合は修正してください。


例を挙げてください。
ジェイエルストン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.