Bagaimana cara mengelola 2 metode DAO dalam satu transaksi?

12

Dalam sebuah wawancara seseorang bertanya kepada saya: Bagaimana kita mengelola 2 metode transaksional / dao dalam satu transaksi. Kemampuan yang diinginkan:

  1. Jika salah satu dari mereka gagal, kita perlu mengembalikan kedua metode.
  2. Kedua metode dapat dipanggil secara terpisah terlampir dengan satu transaksi.
  3. Manajemen harus pada lapisan DAO, bukan pada lapisan layanan.

Saya pikir: pertanyaannya berkaitan dengan manajemen transaksi pegas.

Satish Pandey
sumber

Jawaban:

12

Pertama-tama, manajemen transaksi harus dilakukan pada lapisan layanan, bukan pada lapisan DAO karena hal itu akan menciptakan banyak overhead kinerja (untuk menangani tingkat isolasi transaksi yang sesuai dan penyebaran pada setiap metode yang berbeda). Juga, ruang lingkup unit kerja berasal dari lapisan layanan alih-alih lapisan akses data: bayangkan melakukan proses bisnis yang perlu berurusan dengan 2 atau lebih DAO.

Ada banyak diskusi di internet yang menunjuk ke arah itu seperti di sini , di sini dan di sini .

Bagaimanapun, karena ini adalah wawancara, mari kita terima pertanyaan apa adanya. Dari sudut pandang saya, Anda akan menggunakan @Transactionalanotasi (atau konfigurasi XML) di kedua metode dan dengan propagasi transaksi dengan REQUIREDnilai. Dengan begitu, ketika salah satu dari metode tersebut dipanggil dan jika tidak ada transaksi sebelumnya, transaksi baru akan dibuat:

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}
Alonso Dominguez
sumber
Apakah ini berarti foo()dan bar()berbagi transaksi yang sama dan jika 1 gagal 1 lainnya juga akan kembalikan? Bisakah Anda memberikan klarifikasi?
Satish Pandey
baik, masing-masing metode mendeklarasikan unit kerjanya sendiri: tx akan dilakukan pada akhir setiap metode dan jika ada dari mereka yang melempar pengecualian, itu akan dibatalkan.
Alonso Dominguez
jadi kita perlu menambahkan @Transactional(propagation = REQUIRED)metode lapisan DAO untuk propagasi dan @Transactionalpada lapisan layanan, tetapi jika saya memakai @Transactionallapisan layanan saja alih-alih menempatkan pada lapisan DAO, apa bedanya?
atish shimpi
propagation = REQUIREDadalah nilai default untuk propagasi anotasi transaksional, jadi tidak perlu untuk menuliskannya.
Daniel Higueras
2

Mengabaikan pegas dan kerangka kerja dalam jawaban saya ..... hanya ide dasar menggunakan parameter fungsi. Saya yakin konsep ini bisa diterapkan dalam [masukkan kerangka kerja di sini].

Anda perlu menangani komit / kembalikan di luar 2 metode DAO. 2 metode perlu mengambil transaksi / koneksi sebagai input.

kode psuedo:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}
mike30
sumber
1 pertanyaan: mengapa kita meneruskan Tran tsebagai parameter dengan kedua metode. Bisakah Anda memberikan penjelasan?
Satish Pandey
@Satish, karena dalam pertanyaan (item # 1 dan # 2), metode DAO perlu memiliki fleksibilitas untuk dipanggil secara independen maupun dependen. Jika Anda melakukan di dalam method1 dengan transaksi lingkup lokal maka Anda tidak dapat memutar kembali jika ada yang salah di method2 karena Anda telah melakukan method1 sebelum method2 dipanggil.
mike30
0

Ada kemungkinan bahwa dua metode harus bekerja secara independen juga pada saat yang sama mungkin berjalan dalam transaksi yang sama. Jadi kita perlu menggunakan Propagasi-Diperlukan. Jika transaksi harus berjalan dalam transaksi yang sama maka akan menggunakan transaksi pertama yang lain transaksi baru dibuat jika dipanggil secara independen. Perbaiki saya jika saya salah.

M Anil Kumar
sumber
Bisakah Anda memberikan contoh?
Jay Elston