Saya punya pertanyaan seperti di bawah ini:
- Apa perbedaan dari keduanya?
- Apakah keduanya didukung oleh semua database?
- Apakah JPA TransactionManager dan JTA TransactionManager berbeda?
Jawaban:
Implementasi JPA memiliki pilihan untuk mengelola transaksi itu sendiri ( RESOURCE_LOCAL
), atau membuatnya dikelola oleh implementasi JTA server aplikasi.
Dalam kebanyakan kasus, RESOURCE_LOCAL baik-baik saja. Ini akan menggunakan transaksi tingkat JDBC dasar. Sisi negatifnya adalah bahwa transaksi tersebut bersifat lokal untuk unit persistensi JPA, jadi jika Anda menginginkan transaksi yang mencakup beberapa unit persistensi (atau database lain), RESOURCE_LOCAL mungkin tidak cukup baik.
JTA juga digunakan untuk mengelola transaksi di seluruh sistem seperti JMS dan JCA, tetapi itu adalah penggunaan yang cukup eksotis bagi kebanyakan dari kita.
Untuk menggunakan JTA, Anda memerlukan dukungannya di server aplikasi Anda, dan juga dukungan dari driver JDBC.
Sebagai tambahan jawaban lainnya
Berikut adalah kutipan dari artikel yang sangat berguna (diterbitkan di situs web Apache TomEE ), yang juga dapat membantu menjawab pertanyaan pertama OP (tautan ke artikel ada di bawah).
Membandingkan konteks persistensi RESOURCE_LOCAL dan JTA
Dengan <persistence-unit transaction-type = "RESOURCE_LOCAL"> ANDA bertanggung jawab atas pembuatan dan pelacakan EntityManager (PersistenceContext / Cache) ...
- Anda harus menggunakan EntityManagerFactory untuk mendapatkan EntityManager
- Instance EntityManager yang dihasilkan adalah PersistenceContext / Cache
- Sebuah EntityManagerFactory dapat disuntikkan melalui @PersistenceUnit penjelasan saja (tidak @PersistenceContext)
- Anda tidak diizinkan menggunakan @PersistenceContext untuk merujuk ke unit berjenis RESOURCE_LOCAL
- Anda harus menggunakan EntityTransaction API untuk memulai / melakukan setiap panggilan ke EntityManger Anda
- Memanggil entityManagerFactory.createEntityManager () dua kali menghasilkan dua instance EntityManager yang terpisah dan karenanya dua PersistenceContexts / Cache terpisah.
- Hal ini hampir tidak pernah ide yang baik untuk memiliki lebih dari satu contoh dari EntityManager digunakan (tidak membuat kedua kecuali Anda telah menghancurkan pertama)
Dengan <ketekunan unit transaksi-type = "JTA"> yang CONTAINER akan melakukan EntityManager (PersistenceContext / Cache) menciptakan dan pelacakan ...
- Anda tidak dapat menggunakan EntityManagerFactory untuk mendapatkan EntityManager
- Anda hanya bisa mendapatkan EntityManager yang disediakan oleh penampung
- Sebuah EntityManager dapat disuntikkan melalui @PersistenceContext penjelasan saja (tidak @PersistenceUnit)
- Anda tidak diizinkan menggunakan @PersistenceUnit untuk merujuk ke unit berjenis JTA
- The EntityManager diberikan oleh wadah adalah referensi ke PersistenceContext / Cache terkait dengan JTA Transaksi.
- Jika tidak ada transaksi JTA yang sedang berlangsung, EntityManager tidak dapat digunakan karena tidak ada PersistenceContext / Cache.
- Setiap orang yang memiliki referensi EntityManager ke unit yang sama dalam transaksi yang sama akan secara otomatis memiliki referensi ke PersistenceContext / Cache yang sama
- The PersistenceContext / Cache adalah memerah dan dibersihkan di JTA komit waktu
Siapa pun yang tertarik mempelajari Java Persistence API - bantulah diri Anda sendiri dan baca artikel lengkapnya di sini: Konsep JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
dan @PersistenceContext
dan @Transactional
dikelola oleh Spring
Resource_Local dan JTA adalah manajer transaksi (metode melakukan transaksi). Ini bukan milik database tetapi komponen yang bertanggung jawab untuk mengkoordinasikan transaksi. Manajer transaksi JPA dan JTA berbeda. Manajer transaksi JPA bertanggung jawab atas transaksi JPA dan Anda ingin menggunakannya jika Anda hanya melakukan transaksi JPA. Manajer transaksi JTA adalah manajer transaksi tujuan umum dan dapat meminta sumber daya lain seperti antrian JMS dalam transaksi. Biasanya kontainer Java EE menggunakan manajer transaksi JTA untuk EJB, entitas JPA, dll.
resource_local vs JTA tentang transaksi lokal vs transaksi global. Ini tentang bisakah kita mengelola banyak sumber daya dalam satu transaksi.
CMT vs BMT tentang siapa yang membuka dan menutup transaksi - pengembang aplikasi atau server aplikasi.