Lingkup transaksi deklaratif
Baik @Transactionanotasi Spring dan JPA memungkinkan Anda untuk menentukan cakupan transaksi aplikasi yang diberikan.
Jadi, jika metode layanan dijelaskan dengan @Transactionalpenjelasan, itu akan berjalan dalam konteks transaksional. Jika metode layanan menggunakan beberapa DAO atau Repositori, semua operasi penulisan iklan baca akan dieksekusi dalam transaksi basis data yang sama.
Musim semi @Transactional
The org.springframework.transaction.annotation.Transactionalpenjelasan telah tersedia sejak 1,2 versi kerangka Spring (sekitar tahun 2005), dan memungkinkan Anda untuk mengatur properti transaksional berikut:
isolation: tingkat isolasi basis data yang mendasarinya
noRollbackFordan noRollbackForClassName: daftar Exceptionkelas Java yang dapat dipicu tanpa memicu rollback transaksi
rollbackFordan rollbackForClassName: daftar Exceptionkelas Java yang memicu pengembalian transaksi saat dilempar
propagation: jenis propagasi transaksi yang diberikan oleh PropagationEnum. Misalnya, jika konteks transaksi dapat diwariskan (misalnya, REQUIRED) atau konteks transaksi baru harus dibuat (misalnya, REQUIRES_NEW) atau jika pengecualian harus dilemparkan jika tidak ada konteks transaksi yang ada (misalnya, MANDATORY) atau jika pengecualian harus dilemparkan jika konteks transaksi saat ini ditemukan (misalnya, NOT_SUPPORTED).
readOnly: apakah transaksi saat ini hanya membaca data tanpa menerapkan perubahan apa pun.
timeout: berapa detik seharusnya konteks transaksi dibiarkan berjalan sampai pengecualian timeout dilemparkan.
valueatau transactionManager: nama TransactionManagerkacang Spring yang akan digunakan saat mengikat konteks transaksi.
Java EE @Transactional
The javax.transaction.Transactionalpenjelasan ditambahkan oleh Java EE 7 spesifikasi (sekitar tahun 2013). Jadi, anotasi Java EE ditambahkan 8 tahun kemudian dari padanan Springnya.
Java EE @Transactionalhanya mendefinisikan 3 atribut:
dontRollbackOn: daftar Exceptionkelas Java yang dapat dipicu tanpa memicu rollback transaksi
rollbackOn: daftar Exceptionkelas Java yang memicu pengembalian transaksi saat dilemparkan
value: strategi propagasi, yang diberikan oleh TxTypeEnum. Misalnya, jika konteks transaksi dapat diwariskan (misalnya, REQUIRED) atau konteks transaksi baru harus dibuat (misalnya, REQUIRES_NEW) atau jika pengecualian harus dilemparkan jika tidak ada konteks transaksi yang ada (misalnya, MANDATORY) atau jika pengecualian harus dilemparkan jika konteks transaksi saat ini ditemukan (misalnya, NOT_SUPPORTED).
Yang mana yang harus dipilih?
Jika Anda menggunakan Spring atau Spring Boot, gunakan @Transactionalanotasi Spring , karena memungkinkan Anda untuk mengonfigurasi lebih banyak atribut daripada @Transactionalanotasi Java EE .
Jika Anda menggunakan Java EE saja, dan Anda menggunakan aplikasi Anda pada server aplikasi Java EE, maka gunakan penjelasan Java EE `` @ Transactional`.
Untuk perincian lebih lanjut tentang perbedaan konfigurasi tingkat isolasi saat menggunakan @Transactionaldefinisi Spring atau Java EE , lihat artikel ini .
javax.transaction.Transactionalsehingga seseorang sekarang dapat menggunakannya juga dalam aplikasi Spring tanpa tindakan tambahan. IMO, ini keputusan yang sangat buruk dari sudut pandang desain , karena dari pengalaman saya banyak pengembang yang secara tidak sadar membingungkan kedua kode ini yang menyebabkan masalah setelahnya.