Lingkup transaksi deklaratif
Baik @Transaction
anotasi Spring dan JPA memungkinkan Anda untuk menentukan cakupan transaksi aplikasi yang diberikan.
Jadi, jika metode layanan dijelaskan dengan @Transactional
penjelasan, 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.Transactional
penjelasan 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
noRollbackFor
dan noRollbackForClassName
: daftar Exception
kelas Java yang dapat dipicu tanpa memicu rollback transaksi
rollbackFor
dan rollbackForClassName
: daftar Exception
kelas Java yang memicu pengembalian transaksi saat dilempar
propagation
: jenis propagasi transaksi yang diberikan oleh Propagation
Enum. 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.
value
atau transactionManager
: nama TransactionManager
kacang Spring yang akan digunakan saat mengikat konteks transaksi.
Java EE @Transactional
The javax.transaction.Transactional
penjelasan ditambahkan oleh Java EE 7 spesifikasi (sekitar tahun 2013). Jadi, anotasi Java EE ditambahkan 8 tahun kemudian dari padanan Springnya.
Java EE @Transactional
hanya mendefinisikan 3 atribut:
dontRollbackOn
: daftar Exception
kelas Java yang dapat dipicu tanpa memicu rollback transaksi
rollbackOn
: daftar Exception
kelas Java yang memicu pengembalian transaksi saat dilemparkan
value
: strategi propagasi, yang diberikan oleh TxType
Enum. 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 @Transactional
anotasi Spring , karena memungkinkan Anda untuk mengonfigurasi lebih banyak atribut daripada @Transactional
anotasi 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 @Transactional
definisi Spring atau Java EE , lihat artikel ini .
javax.transaction.Transactional
sehingga 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.