Progress-4gl: ขอบเขตธุรกรรมใช้กับการเรียกโปรแกรมภายนอกอย่างไร

Aug 20 2020

ฉันต้องการความช่วยเหลือในการทำความเข้าใจขอบเขตธุรกรรมสำหรับขั้นตอน / โปรแกรมนอกโปรแกรมปัจจุบัน

สมมติว่าฉันมีสามโปรแกรมโปรแกรม 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.

คำตอบ

4 MikeFechner Aug 20 2020 at 02:58

ใช่. ทุกอย่างที่เกิดขึ้นในบล็อกธุรกรรมจะถูกยกเลิก

5 TomBascom Aug 20 2020 at 04:01

ใช่. ในตัวอย่างที่คุณอธิบายทุกอย่างถูกย้อนกลับ

ไม่มากนักที่จะมีการ "ขยาย" ต่อ แต่เพียงแค่ว่าธุรกรรมนั้นรวมทุกอย่างที่เกิดขึ้นในเซสชันนั้นตั้งแต่ช่วงเวลาที่เปิดใช้งานไปตลอดทางจนกว่าจะมีการตกลงหรือย้อนกลับ โพรซีเดอร์ภายในโพรซีเดอร์ภายนอกฟังก์ชั่นที่ผู้ใช้กำหนดเมธอดคลาสโค้ดทริกเกอร์เป็นต้น

"ในเซสชันนั้น" มีความสำคัญ - หากคุณเรียกใช้โพรซีเดอร์บนเซิร์ฟเวอร์แอปกิจกรรมนั้นจะไม่รวมอยู่ด้วยเนื่องจากเป็นกระบวนการของตัวเองที่มีบริบทธุรกรรมที่แตกต่างกัน

เมื่อเซิร์ฟเวอร์แอปมีส่วนเกี่ยวข้องกับสิ่งต่างๆยุ่งเหยิง ผู้โทรเดิมไม่มีความสามารถ (ในตัว) ที่จะรู้ว่าจะย้อนกลับอะไรในเซสชันเซิร์ฟเวอร์แอปที่เรียกว่า การเรียกเซิร์ฟเวอร์ของแอปอาจส่งคืนข้อผิดพลาดที่ทำให้ผู้โทรย้อนกลับหากพบปัญหา แต่ผู้โทรสามารถตัดสินใจดักจับและเพิกเฉยต่อข้อผิดพลาดนั้นได้