Untuk waktu yang lama, saya menerapkan sistem pemeriksaan yang rumit untuk dapat menggunakan transaksi basis data. Logika transaksi berjalan sebagai berikut: membuka transaksi, melakukan operasi database, kembalikan pada kesalahan atau komit pada kesuksesan. Komplikasi datang dari apa yang terjadi ketika Anda ingin operasi tambahan dilakukan dalam transaksi yang sama. Anda harus menulis metode kedua sepenuhnya yang melakukan kedua operasi, atau Anda dapat memanggil metode asli Anda dari satu detik, membuka transaksi hanya jika salah satu belum dibuka dan melakukan / mengembalikan perubahan hanya jika Anda adalah satu untuk membuka transaksi.
Sebagai contoh:
public void method1() {
boolean selfOpened = false;
if(!transaction.isOpen()) {
selfOpened = true;
transaction.open();
}
try {
performDbOperations();
method2();
if(selfOpened)
transaction.commit();
} catch (SQLException e) {
if(selfOpened)
transaction.rollback();
throw e;
}
}
public void method2() {
boolean selfOpened = false;
if(!transaction.isOpen()) {
selfOpened = true;
transaction.open();
}
try {
performMoreDbOperations();
if(selfOpened)
transaction.commit();
} catch (SQLException e) {
if(selfOpened)
transaction.rollback();
throw e;
}
}
Harap dicatat, saya tidak menganjurkan kode di atas dengan cara apa pun. Ini harus menjadi contoh dari apa yang tidak boleh dilakukan!
Tampaknya konyol untuk membuat metode kedua untuk melakukan logika yang sama dengan yang pertama ditambah sesuatu yang ekstra, namun saya ingin dapat memanggil bagian API database dari program dan menutup masalah di sana. Namun, sementara ini sebagian menyelesaikan masalah saya, setiap metode yang saya tulis melibatkan penambahan logika verbose untuk memeriksa apakah suatu transaksi sudah terbuka, dan melakukan / mengembalikan perubahan jika metode saya membukanya.
Masalahnya adalah konseptual. Saya seharusnya tidak mencoba merangkul setiap skenario yang mungkin. Pendekatan yang tepat adalah untuk menempatkan logika transaksi dalam metode tunggal yang menggunakan metode kedua sebagai parameter yang akan melakukan logika database aktual. Logika itu menganggap transaksi terbuka dan bahkan tidak melakukan pemeriksaan. Metode-metode ini dapat dipanggil dalam kombinasi sehingga metode ini tidak berantakan dengan logika transaksi yang tidak perlu.
Alasan saya menyebutkan ini adalah karena kesalahan saya adalah berasumsi bahwa saya perlu membuat metode saya berfungsi dalam situasi apa pun. Dengan melakukan itu, saya tidak hanya dipanggil metode memeriksa apakah transaksi terbuka, tetapi juga orang-orang yang disebutnya. Dalam hal ini, ini bukan hit kinerja utama, tetapi jika mengatakan, saya perlu memverifikasi keberadaan catatan dalam database sebelum melanjutkan, saya akan memeriksa setiap metode yang memerlukannya ketika saya seharusnya hanya mengasumsikan selama itu penelepon harus dibuat sadar bahwa catatan itu harus ada. Jika metode ini dipanggil, ini adalah perilaku yang tidak terdefinisi dan Anda tidak perlu khawatir tentang apa yang terjadi.
Sebaliknya Anda harus memberikan banyak dokumentasi, dan menulis apa yang Anda harapkan benar sebelum panggilan dibuat ke metode Anda. Jika cukup penting, tambahkan itu sebagai komentar sebelum metode Anda sehingga tidak boleh ada kesalahan (javadoc memberikan dukungan yang bagus untuk hal semacam ini di java).
Saya harap itu membantu!