インタビューで誰かが私に尋ねました:1つのトランザクションで2つのトランザクション/ daoメソッドをどのように管理しますか?必要な機能:
質問は、春のトランザクション管理に関連しています。
まず、トランザクション管理はDAOレイヤーではなくサービスレイヤーで行う必要があります(適切なトランザクション分離レベルとさまざまな方法での伝達を処理するため)パフォーマンスのオーバーヘッドが大きくなるためです。また、作業単位のスコープは、データアクセスレイヤーではなくサービスレイヤーから取得されます:2つ以上のDAOを処理する必要があるビジネスプロセスの実行を想像してください。
インターネットでは、その方向を here 、 here および here として指摘する多くの議論があります。
とにかく、面接なので質問はそのまま受け入れましょう。私の観点からは、@Transactional
アノテーション(またはXML構成)と、REQUIRED
値を使用したトランザクション伝達の両方のメソッド。このようにして、これらのメソッドのいずれかが呼び出され、前のトランザクションが存在しない場合、新しいトランザクションが作成されます。
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
私の答えで春とフレームワークを無視しています.....関数パラメーターを使用する基本的なアイデアです。このコンセプトは[ここにフレームワークを挿入]にも適用できると思います。
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(); }
}
2つのメソッドが独立して機能すると同時に、同じトランザクションで実行される可能性があるため、Propagation-Requiredを使用する必要があります。トランザクションを同じトランザクションで実行する必要がある場合は、最初のトランザクションを使用します。それ以外の場合、独立して呼び出されると、新しいトランザクションが作成されます。私が間違っていたら訂正してください。