Saya tidak mengerti apa perbedaan aktual antara anotasi javax.transaction.Transactional
dan org.springframework.transaction.annotation.Transactional
?
Apakah org.springframework.transaction.annotation.Transactional
perpanjangan javax.transaction.Transactional
atau mereka memiliki arti yang sama sekali berbeda? Kapan masing-masing digunakan? Spring @Transactinal
di lapisan layanan dan javax di DAO?
Terimakasih telah menjawab.
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.org.springframework.transaction.annotation.Transactional
menawarkan lebih banyak pilihan (sepertireadOnly
,timeout
) daripadajavax.transaction.Transactional
Perbedaan lainnya adalah bagaimana Spring menangani anotasi @Transaksional
javax.ejb.TransactionAttribute
tersedia di classpath (dari versi 2.5.3 ke 3.2.5). Dengan demikian Anda dapat berakhir dengan anotasi yang tidak diperhitungkan jika hanyajavax.transaction.Transactional
ada di kelas Anda dan tidakjavax.ejb.TransactionAttribute
. Ini dapat terjadi jika Anda bekerja dengan Hibernate: hibernate-core (4.3.7.Final) tergantung pada jboss-transaction-api_1.2_spec (1.0.0.Final), yang tidak menyediakanjavax.ejb.TransactionAttribute
.sumber
Harap berhati-hati, (masalah ini terjadi pada kucing jantan),
Jika aplikasi Anda adalah aplikasi web SPRING dan Anda menggunakan mekanisme penanganan transaksi Spring
@org.springframework.transaction.annotation.Transactional
, maka jangan campur dengan javax.transaction.Transactional.Itu selalu digunakan,
@org.springframework.transaction.annotation.Transactional
dalam aplikasi pegas secara konsisten.Kalau tidak, kita mungkin berakhir dengan kesalahan ini,
sumber
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 mendasarinyanoRollbackFor
dannoRollbackForClassName
: daftarException
kelas Java yang dapat dipicu tanpa memicu rollback transaksirollbackFor
danrollbackForClassName
: daftarException
kelas Java yang memicu pengembalian transaksi saat dilemparpropagation
: jenis propagasi transaksi yang diberikan olehPropagation
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
atautransactionManager
: namaTransactionManager
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
: daftarException
kelas Java yang dapat dipicu tanpa memicu rollback transaksirollbackOn
: daftarException
kelas Java yang memicu pengembalian transaksi saat dilemparkanvalue
: strategi propagasi, yang diberikan olehTxType
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`.
sumber