インタビューで誰かが私に尋ねました:単一のトランザクションで2つのトランザクション/ダオ方法をどのように管理しますか。必要な機能:
- それらのいずれかが失敗した場合、両方の方法をロールバックする必要があります。
- 両方のメソッドは、単一のトランザクションで個別に接続して呼び出すことができます。
- 管理は、サービス層ではなくDAO層で行う必要があります。
私は思う:質問は春のトランザクション管理に関連しています。
インタビューで誰かが私に尋ねました:単一のトランザクションで2つのトランザクション/ダオ方法をどのように管理しますか。必要な機能:
私は思う:質問は春のトランザクション管理に関連しています。
回答:
まず、トランザクション管理は、多くのパフォーマンスオーバーヘッドが発生するため、DAO層ではなくサービス層で実行する必要があります(適切なトランザクション分離レベルと各メソッドでの伝播に対処するため)。また、作業単位の範囲は、データアクセス層ではなくサービス層からのものです。2つ以上のDAOを処理する必要があるビジネスプロセスの実行を想像してください。
インターネットでの議論の多くは、そのようにその方向にポイントがあり、ここで、こことここ。
とにかく、インタビューなので質問をそのまま受け入れましょう。私の観点からは@Transactional
、両方のメソッドでアノテーション(またはXML構成)を使用し、REQUIRED
値を伴うトランザクション伝播で使用することになります。そのようにして、これらのメソッドのいずれかが呼び出され、以前のトランザクションが存在しない場合、新しいトランザクションが作成されます。
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
@Transactional(propagation = REQUIRED)
、伝播と@Transactional
サービス層にDAO層メソッドを追加する必要がありますが、DAO層に入れる@Transactional
代わりにサービス層のみに入れると、違いは何ですか?
propagation = REQUIRED
トランザクションアノテーション伝播のデフォルト値であるため、記述する必要はありません。
私の答えでは春とフレームワークを無視します。....関数パラメータを使用する基本的な考え方です。この概念は[ここにフレームワークを挿入]に適用できると確信しています。
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(); }
}
Tran t
両方のメソッドでパラメーターとして渡す理由。説明をお願いできますか?
foo()
、bar()
共有し、1つが失敗した場合、別の1もロールバックしますか?明確化を提供できますか?