Anotasi Transaksional: Musim Semi vs. JTA

Ketekunan teratas

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Dalam tutorial ini, kita akan membahas perbedaan antara org.springframework.transaction.annotation.Transactional dan javax.transaction.Transactional annotations .

Kami akan mulai dengan gambaran umum tentang properti konfigurasinya. Kemudian, kita akan membahas jenis komponen apa yang masing-masing dapat diterapkan, dan dalam keadaan apa kita dapat menggunakan salah satunya.

2. Perbedaan Konfigurasi

Anotasi Transaksional Spring hadir dengan konfigurasi tambahan dibandingkan dengan rekan JTA-nya:

  • Isolation - Spring menawarkan isolasi cakupan transaksi melalui properti isolasi ; namun, di JTA, fitur ini hanya tersedia di tingkat koneksi
  • Propagasi - tersedia di kedua pustaka, melalui properti propagasi di Spring, dan properti nilai di Java EE; Spring menawarkan Nested sebagai tipe propagasi tambahan
  • Read-Only - hanya tersedia di Spring melalui properti readOnly
  • Timeout - hanya tersedia di Spring melalui properti timeout
  • Rollback - kedua anotasi menawarkan manajemen rollback; JTA menyediakan properti rollbackOn dan dontRollbackOn , sedangkan Spring memiliki rollbackFor dan noRollbackFor , ditambah dua properti tambahan: rollbackForClassName dan noRollbackForClassName

2.1. Konfigurasi Anotasi Transaksional Musim Semi

Sebagai contoh, mari gunakan dan konfigurasikan anotasi Spring Transactional pada layanan mobil sederhana:

import org.springframework.transaction.annotation.Transactional; @Service @Transactional( isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, readOnly = false, timeout = 30) public class CarService { @Autowired private CarRepository carRepository; @Transactional( rollbackFor = IllegalArgumentException.class, noRollbackFor = EntityExistsException.class, rollbackForClassName = "IllegalArgumentException", noRollbackForClassName = "EntityExistsException") public Car save(Car car) { return carRepository.save(car); } }

2.3. Konfigurasi Anotasi Transaksional JTA

Mari lakukan hal yang sama untuk layanan persewaan sederhana menggunakan anotasi JTA Transaksional :

import javax.transaction.Transactional; @Service @Transactional(Transactional.TxType.SUPPORTS) public class RentalService { @Autowired private CarRepository carRepository; @Transactional( rollbackOn = IllegalArgumentException.class, dontRollbackOn = EntityExistsException.class) public Car rent(Car car) { return carRepository.save(car); } }

3. Penerapan dan Dapat Dipertukarkan

Anotasi JTA Transaksional berlaku untuk kacang yang dikelola CDI dan kelas yang didefinisikan sebagai kacang yang dikelola oleh spesifikasi Java EE, sedangkan penjelasan Transaksional Spring hanya berlaku untuk kacang Spring.

Perlu juga dicatat bahwa dukungan untuk JTA 1.2 diperkenalkan di Spring Framework 4.0. Dengan demikian, kita dapat menggunakan anotasi Transaksional JTA di aplikasi Spring . Namun, sebaliknya tidak dimungkinkan karena kita tidak dapat menggunakan anotasi Musim Semi di luar konteks Musim Semi.

4. Kesimpulan

Dalam tutorial ini, kita membahas perbedaan antara anotasi Transaksional dari Spring dan JTA, dan kapan kita dapat menggunakan satu atau lainnya.

Seperti biasa, kode dari tutorial ini tersedia di GitHub.

Ketekunan bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya