Spring@Transation alはいったいどういう仕事をしていますか?


この文章では、spring事務管理機構を深く分析し、@Transactionがどのように働いているかを確認します.
JPAと事務管理
JPA自身がいかなるタイプの声明も提供していないことに気づいた事務管理は重要である.注入容器に依存する外部でJPAを使用する場合は、開発者が手動で管理する必要があります.
UserTransaction utx = entityManager.getTransaction(); 
    try { 
        utx.begin(); 
        businessLogic();
        utx.commit(); 
    } catch(Exception ex) { 
        utx.rollback(); 
        throw ex; 
    }
事務を管理する方式は事務の作用範囲を一目瞭然にさせますが、いくつかの欠点があります.
1、反復性が高く、エラーが発生しました.
2、どんな間違いでも深刻な影響を及ぼす可能性があります.
3、エラーは調整とコピーが難しいです.
4、コードの可読性が低下します.
5、もしこの方法が他の事務方法を呼び出したらどうすればいいですか?
springを使う@Transation al
springの@Transactionalを使うと、上のコードは下の形に簡略化されます.
  @Transactional
    public void businessLogic() {
        ... use entity manager inside a transaction ...
    }
これはより便利であり、読み取り可能であり、これもまた、springで推奨される方法である.
を使って
@Transationは、多くの重要な点、例えば、事務伝播が自動的に処理されている場合、もう一つの事務方法がこの事務方法に呼び出されたら、その方法は選択的にこの運行の事務に入ることができます.潜在的な問題は、強力で複雑なメカニズムがラベルの下で実行され、問題が発生すると調整が難しいということです.
@Transationとはどういう意味ですか?
@Transactionの二つのポイントは二つの異なる概念があります.それぞれは自分の範囲とライフサイクルがあります.
the persistence context the database traction
このトランザクションラベルは独自に単一のデータベーストランザクションの範囲を定義し、データベース事務の範囲は持続的なコンテキスト範囲内にある.JPAでの持続的なコンテキスト時にEnttityManagerは、内部でHbernateのSessionを実現しました.持続的なコンテキストは、限定されたjavaオブジェクトを追跡し、これらのオブジェクトにおける変更が最終的にデータベースに持続することを確認する同期オブジェクトにすぎない.これはデータベース事務のどの概念とも大きな違いがあります.一つのEntity Managerは多くのデータベース事務で使用できます.実際にもそうです.
いつEnttityManagerスパンの多いデータベースの事務ですか?
最も一般的な例は、アプリケーションがViewモードでOpenSessionを使用する場合であり、このような例では、view層でのクエリーは、複数のデータベース事務に分割されているが、彼らは一つのentity managerを通じて完成されている.もう一つの例は、恒久化されたコンテキストが開発者にPersistence ContectType.EXTENDEDとしてマークされたとき、複数の要求の中で生存できることを意味する.
何がEnttityManager VS事務関係を定義しましたか?
これは開発者の選択肢の一つですが、最も一般的な方法はアプリケーション事務を使ってEntity Managerのモードを使い、EnttityManagerに注入する最も一般的な方法です.
@PersistenceContext
    private EntityManager em;
ここではデフォルトでは
一つのアプリケーション事務はEnttityManagerのモードを使用しています.このモードで私達が@Transationの方法でこのEnttityManagerを使えば、この方法は単独のデータベース事務で実行されます.
原文の住所:http://blog.jhades.org/how-does-spring-transactional-really-work/