Progress-4gl: ขอบเขตธุรกรรมใช้กับการเรียกโปรแกรมภายนอกอย่างไร
ฉันต้องการความช่วยเหลือในการทำความเข้าใจขอบเขตธุรกรรมสำหรับขั้นตอน / โปรแกรมนอกโปรแกรมปัจจุบัน
สมมติว่าฉันมีสามโปรแกรมโปรแกรม A โปรแกรม B และโปรแกรม C ภายในโปรแกรม A ฉันมีขั้นตอนที่มีบางบรรทัดห่ออยู่ภายในdo transaction
บล็อก (ไม่พิมพ์อย่างแรง) ภายในdo transaction
บล็อกนั้นจะเรียกโปรแกรม B อื่นเมื่อกลับมาจากโปรแกรม B จะมีคำสั่งเลิกทำออก ภายในบล็อกธุรกรรมเดียวกันจะเรียกโปรแกรม C และมีการเลิกทำออกจากการโทรนี้ด้วย
คำถามของฉันคือถ้าภายในบล็อกธุรกรรมโปรแกรม B จะดำเนินการโดยไม่มีข้อผิดพลาด แต่โปรแกรม c ส่งกลับข้อผิดพลาดการเลิกทำจะออกหลังจากการเรียกโปรแกรม C จะยกเลิกธุรกรรมที่เกิดขึ้นในโปรแกรม 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.
คำตอบ
ใช่. ทุกอย่างที่เกิดขึ้นในบล็อกธุรกรรมจะถูกยกเลิก
ใช่. ในตัวอย่างที่คุณอธิบายทุกอย่างถูกย้อนกลับ
ไม่มากนักที่จะมีการ "ขยาย" ต่อ แต่เพียงแค่ว่าธุรกรรมนั้นรวมทุกอย่างที่เกิดขึ้นในเซสชันนั้นตั้งแต่ช่วงเวลาที่เปิดใช้งานไปตลอดทางจนกว่าจะมีการตกลงหรือย้อนกลับ โพรซีเดอร์ภายในโพรซีเดอร์ภายนอกฟังก์ชั่นที่ผู้ใช้กำหนดเมธอดคลาสโค้ดทริกเกอร์เป็นต้น
"ในเซสชันนั้น" มีความสำคัญ - หากคุณเรียกใช้โพรซีเดอร์บนเซิร์ฟเวอร์แอปกิจกรรมนั้นจะไม่รวมอยู่ด้วยเนื่องจากเป็นกระบวนการของตัวเองที่มีบริบทธุรกรรมที่แตกต่างกัน
เมื่อเซิร์ฟเวอร์แอปมีส่วนเกี่ยวข้องกับสิ่งต่างๆยุ่งเหยิง ผู้โทรเดิมไม่มีความสามารถ (ในตัว) ที่จะรู้ว่าจะย้อนกลับอะไรในเซสชันเซิร์ฟเวอร์แอปที่เรียกว่า การเรียกเซิร์ฟเวอร์ของแอปอาจส่งคืนข้อผิดพลาดที่ทำให้ผู้โทรย้อนกลับหากพบปัญหา แต่ผู้โทรสามารถตัดสินใจดักจับและเพิกเฉยต่อข้อผิดพลาดนั้นได้