「scope」が正しい用語であるかどうかは不明です。@Transactionalの範囲を最小限にしたいですか?
私は、JPAトランザクション管理(下のHibernateを使用)にSpringを使用しています。データベーストランザクションをプリフォームへの私の方法はプライベートですが、あなただけのクラスまたはpublic method
に@Transactionalを設定することができるので、このメカニズムは、プロキシ上で、唯一「外部」の方法は、プロキシ経由で着信したコールベースにしているためだろう傍受される。これは、呼び出されたメソッドが@Transactional!でマークされていても、実行時に 'self-invocation'、つまりターゲットオブジェクト内の他のメソッドを呼び出すターゲットオブジェクト内のメソッドは実際のトランザクションにつながりません。
クラスのパブリックエントリポイントを@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クラスに移動してパブリックにすることを考えていましたが、学問的なポイントとして、リファクタリングが一般に公開されていればパフォーマンス上のメリットがあるかどうかを知りたかったのです。
私はそれらを正しく理解すれば、反対のことを言っているのですが、他の誰かがこの質問にうかがいますか? –
質問にはhttp://stackoverflow.com/questions/1079114が関係しています。 –