Saat Anda memanggil metode tanpa @Transactional
dalam blok transaksi, transaksi induk akan melanjutkan ke metode baru. Ini akan menggunakan koneksi yang sama dari metode induk (dengan @Transactional
) dan pengecualian apa pun yang disebabkan dalam metode yang dipanggil (tanpa @Transactional
akan menyebabkan transaksi dibatalkan seperti yang dikonfigurasi dalam definisi transaksi.
Jika Anda memanggil metode dengan @Transactional
anotasi dari metode dengan @Transactional
instance yang sama, maka perilaku transaksional metode yang disebut tidak akan berdampak apa pun pada transaksi. Tetapi jika Anda memanggil metode dengan definisi transaksi dari metode lain dengan definisi transaksi, dan mereka berada dalam contoh yang berbeda, maka kode dalam metode yang dipanggil akan mengikuti definisi transaksi yang diberikan dalam metode yang dipanggil.
Anda dapat menemukan detail selengkapnya di bagian Manajemen transaksi deklaratif dari dokumentasi transaksi musim semi .
Model transaksi deklaratif pegas menggunakan proxy AOP. jadi proxy AOP bertanggung jawab atas pembuatan transaksi. Proksi AOP akan aktif hanya jika metode dengan dalam contoh dipanggil dari luar contoh.
will follow the transaction definitions given in the called method
. Tetapi jika panggilan tersebut berasal dari instance objek yang sama, panggilan tersebut tidak akan berpengaruh karena panggilan tersebut tidak akan menyebar melalui proxy aop yang bertanggung jawab untuk pemeliharaan transaksi.@Transactional
definisi dari objek / instance yang berbeda maka meskipun metode pemanggilan memiliki@Transactional
atribut yang berbeda , metode yang dipanggil akan mengikuti definisi transaksinya sendiri.Itu tergantung pada tingkat propagasi . Berikut semua kemungkinan nilai level .
Misalnya jika level propagasi NESTED, transaksi saat ini akan "ditangguhkan" dan transaksi baru akan dibuat ( catatan: pembuatan aktual dari transaksi bersarang hanya akan berfungsi pada manajer transaksi tertentu )
Tingkat penyebaran default (yang Anda sebut "perilaku") DIPERLUKAN . Jika metode "dalam" dipanggil yang memiliki
@Transactional
anotasi di dalamnya (atau ditransaksikan secara deklaratif melalui XML), metode tersebut akan dijalankan dalam transaksi yang sama , misalnya "tidak ada yang baru" dibuat.sumber
@Transactional menandai batas transaksi (awal / akhir) tetapi transaksi itu sendiri terikat ke utas. Setelah transaksi dimulai, ia menyebar ke seluruh pemanggilan metode hingga metode asli kembali dan transaksi melakukan / memutar kembali.
Jika metode lain dipanggil yang memiliki anotasi @Transactional, propagasi bergantung pada atribut propagasi dari anotasi tersebut.
sumber
Metode bagian dalam akan mempengaruhi metode luar jika metode bagian dalam tidak dianotasi dengan @Transactional.
Jika metode bagian dalam juga dianotasi dengan @Transactional dengan
REQUIRES_NEW
, berikut akan terjadi.... @Autowired private TestDAO testDAO; @Autowired private SomeBean someBean; @Override @Transactional(propagation=Propagation.REQUIRED) public void outerMethod(User user) { testDAO.insertUser(user); try{ someBean.innerMethod(); } catch(RuntimeException e){ // handle exception } } @Override @Transactional(propagation=Propagation.REQUIRES_NEW) public void innerMethod() { throw new RuntimeException("Rollback this transaction!"); }
Metode bagian dalam diberi anotasi
REQUIRES_NEW
dan menampilkan RuntimeException sehingga akan menyetel transaksinya ke rollback tetapi TIDAK AKAN MEMPENGARUHI transaksi luar. Transaksi luar DIJEDA ketika transaksi dalam dimulai dan kemudian dilanjutkan SETELAH transaksi dalam diselesaikan. Mereka berjalan secara independen satu sama lain sehingga transaksi luar DAPAT berhasil dilakukan.sumber