2

ここで「スコープ」という用語が正しいかどうかはわかりません。

JPAトランザクション管理にSpringを使用しています(下にHibernateがあります)。データベーストランザクションを実行するための私のメソッドはプライベートですが、 @Transactional はクラスまたはパブリックメソッドでのみ設定できるため

このメカニズムはプロキシに基づいているため、プロキシを介して着信する「外部」メソッド呼び出しのみが傍受されます。これは、「自己呼び出し」、つまり、ターゲット オブジェクト内のメソッドがターゲット オブジェクトの他のメソッドを呼び出す場合、呼び出されたメソッドが @Transactional でマークされていても、実行時に実際のトランザクションにつながらないことを意味します。

クラスのパブリック エントリ ポイントを @Transactional に設定しました。

@Transactional
public void run(parameters) {
    //First non-database method, takes a decent amount of time
    Data data = getData();
    //Call to database
    storeData(data);
}

private storeData(data) {
    em.persist(data);
}

これは悪い習慣ですか?Spring は、ここで必要とされるよりも長くオープン トランザクションを保持しますか? storeData() メソッドを DAO クラスに移動して公開しようと考えていたのですが、学問的なポイントとして、公開にリファクタリングするとパフォーマンスが向上するかどうかを知りたいと思いました。

4

3 に答える 3

1

DB で激しい競合が発生している場合、トランザクションをできるだけ小さく保つことは間違いなく重要です。それ自体はパフォーマンスやスケーラビリティに影響しないパブリックとプライベートの区別よりもはるかに重要です。だから、実践してください...!

于 2009-04-30T15:23:14.957 に答える
1

トランザクション スコープは、コードがトランザクション コンテキスト (この場合は storeData() メソッド) と対話する何かを実行するまで効果がありません。データベースのロックは storeData() に達したときにのみ発生するため、 getData() が非トランザクションであることは、コードの同時実行のパフォーマンスに影響を与えません。

于 2009-04-30T15:23:46.563 に答える