Progress-4gl: Bagaimana cakupan transaksi berlaku untuk pemanggilan program eksternal?
Saya butuh bantuan untuk memahami pelingkupan transaksi untuk prosedur / program di luar program saat ini.
Misalkan saya memiliki tiga program, program A, program B dan program C. Di dalam program A, saya memiliki prosedur yang memiliki beberapa baris di dalamnya yang dibungkus di dalam do transaction
blok (tidak diketik dengan kuat). Di dalam do transaction
blok itu, ia memanggil Program B. Setelah kembali dari program B ada perintah urungkan, tinggalkan. Dalam blok transaksi yang sama, ia memanggil program C dan memiliki pembatalan, keluar setelah panggilan ini juga.
Pertanyaan saya adalah, jika di dalam blok transaksi, program B dijalankan tanpa kesalahan, tetapi program c mengembalikan kesalahan, apakah pembatalan, keluar setelah pemanggilan program C juga akan membatalkan transaksi yang terjadi di dalam program B?
Procedure do_something:
some processing....
do transaction:
error-message = "".
{run programB.p}
if error-message <> "" then undo, leave.
some further processing...
error-message = "".
{run programC.p}
if error-message <> "" then undo, leave.
end. /* end of do transaction */
end procedure.
Jawaban
Iya. Semua yang terjadi di blok transaksi akan dibatalkan.
Iya. Dalam contoh yang Anda gambarkan semuanya akan dibatalkan.
Ini tidak begitu banyak sehingga "diperpanjang" per se tetapi hanya transaksi yang mencakup semua yang terjadi dalam sesi itu dari titik waktu ketika diaktifkan sepenuhnya sampai itu dilakukan atau dibatalkan. Prosedur internal, prosedur eksternal, fungsi yang ditentukan pengguna, metode kelas, kode pemicu, dll.
"Dalam sesi itu" penting - jika Anda memanggil prosedur pada server aplikasi, aktivitas tersebut TIDAK disertakan karena ini adalah prosesnya sendiri dengan konteks transaksinya sendiri yang berbeda.
Ketika server aplikasi terlibat, semuanya menjadi berantakan. Penelepon asli tidak memiliki kemampuan (bawaan) untuk mengetahui apa yang harus dibatalkan dalam sesi server aplikasi yang disebut. Panggilan server aplikasi dapat menampilkan kesalahan yang menyebabkan pemanggil memutar kembali jika mengalami masalah, tetapi pemanggil juga dapat memutuskan untuk menjebak dan mengabaikan kesalahan tersebut.