การทำธุรกรรมอัตโนมัติใน Oracle PL/SQL: คอมมิต, ย้อนกลับ

คำสั่ง TCL ใน PL/SQL คืออะไร

TCL ย่อมาจาก Transaction Control Statements มันจะบันทึกธุรกรรมที่รอดำเนินการหรือย้อนกลับธุรกรรมที่รอดำเนินการ คำสั่งเหล่านี้มีบทบาทสำคัญเพราะเว้นแต่ธุรกรรมจะได้รับการบันทึก การเปลี่ยนแปลงผ่านคำสั่ง DML จะไม่ถูกบันทึกในฐานข้อมูล ด้านล่างนี้คือคำชี้แจงต่างๆ ของ TCL

COMMIT บันทึกธุรกรรมที่ค้างอยู่ทั้งหมด
ย้อนกลับ ยกเลิกธุรกรรมที่รอดำเนินการทั้งหมด
ประหยัด สร้างจุดในการทำธุรกรรมซึ่งสามารถทำการย้อนกลับได้ในภายหลัง
ย้อนกลับไปยัง ยกเลิกธุรกรรมที่รอดำเนินการทั้งหมดจนกว่าจะถึงที่ระบุไว้

การทำธุรกรรมจะเสร็จสมบูรณ์ภายใต้สถานการณ์ต่อไปนี้

  • เมื่อมีการออกแถลงการณ์ข้างต้น (ยกเว้น SAVEPOINT)
  • เมื่อมีการออกใบแจ้งยอด DDL (DDL เป็นคำสั่งยืนยันอัตโนมัติ)
  • เมื่อมีการออกแถลงการณ์ DCL (DCL เป็นคำสั่งยืนยันอัตโนมัติ)

ธุรกรรมอัตโนมัติคืออะไร

ใน PL/SQL การแก้ไขข้อมูลทั้งหมดจะเรียกว่าเป็นธุรกรรม ธุรกรรมจะถือว่าเสร็จสมบูรณ์เมื่อมีการใช้การบันทึก/ทิ้ง หากไม่มีการบันทึก/ละทิ้ง ธุรกรรมจะไม่ถือว่าเสร็จสมบูรณ์ และการแก้ไขที่ทำกับข้อมูลจะไม่ถูกทำให้ถาวรบนเซิร์ฟเวอร์

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

  • ธุรกรรมอัตโนมัตินี้สามารถระบุได้ในระดับโปรแกรมย่อย
  • หากต้องการให้โปรแกรมย่อยทำงานในธุรกรรมอื่น ควรกำหนดคีย์เวิร์ด 'PRAGMA AUTONOMOUS_TRANSATION' ในส่วนประกาศของบล็อกนั้น
  • โดยจะสั่งให้คอมไพเลอร์ถือว่าสิ่งนี้เป็นธุรกรรมที่แยกจากกัน และการบันทึก/ทิ้งภายในบล็อกนี้จะไม่สะท้อนให้เห็นในธุรกรรมหลัก
  • การออก COMMIT หรือ ROLLBACK เป็นสิ่งจำเป็นก่อนที่จะออกจากธุรกรรมแบบอิสระนี้ไปยังธุรกรรมหลัก เนื่องจากในเวลาใดก็ตามสามารถดำเนินการได้เพียงธุรกรรมเดียวเท่านั้น
  • ดังนั้นเมื่อเราทำธุรกรรมแบบอัตโนมัติแล้ว เราจำเป็นต้องบันทึกและทำธุรกรรมให้เสร็จสิ้น มีเพียงเราเท่านั้นที่สามารถย้ายกลับไปยังธุรกรรมหลักได้

ไวยากรณ์:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • ในรูปแบบข้างต้น บล็อกถูกสร้างขึ้นเป็นธุรกรรมแบบอัตโนมัติ

1 ตัวอย่าง: ในตัวอย่างนี้ เราจะมาทำความเข้าใจว่าธุรกรรมอัตโนมัติทำงานอย่างไร

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
   UPDATE emp 
   SET salary = salary + 5000 
   WHERE emp_no = 1001;

nested_block;
ROLLBACK;

 SELECT salary INTO  l_salary FROM emp WHERE emp_no = 1001;
 dbms_output.put_line('After Salary of 1001 is'|| l_salary);
 SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
 dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;

เอาท์พุต

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

การทำธุรกรรมอัตโนมัติ

คำอธิบายรหัส:

  • รหัสบรรทัดที่ 2: ประกาศ l_salary เป็น NUMBER
  • รหัสบรรทัดที่ 3: ประกาศขั้นตอน Nested_block
  • รหัสบรรทัดที่ 4: ทำให้ขั้นตอน Nested_block เป็น 'AUTONOMOUS_TRANSACTION'
  • รหัสบรรทัด 7-9: เพิ่มเงินเดือนสำหรับพนักงานหมายเลข 1002 เป็น 15000
  • รหัสบรรทัด 10: การทำธุรกรรม
  • รหัสบรรทัด 13-16: การพิมพ์รายละเอียดเงินเดือนของพนักงาน 1001 และ 1002 ก่อนการเปลี่ยนแปลง
  • รหัสบรรทัด 17-19: เพิ่มเงินเดือนสำหรับพนักงานหมายเลข 1001 เป็น 5000
  • รหัสบรรทัด 20: เรียกขั้นตอน Nested_block;
  • รหัสบรรทัด 21: ยกเลิกธุรกรรมหลัก
  • รหัสบรรทัด 22-25: การพิมพ์รายละเอียดเงินเดือนของพนักงาน 1001 และ 1002 หลังจากการเปลี่ยนแปลง
  • การขึ้นเงินเดือนสำหรับพนักงานหมายเลข 1001 จะไม่สะท้อนให้เห็น เนื่องจากธุรกรรมหลักถูกยกเลิกแล้ว การขึ้นเงินเดือนสำหรับพนักงานหมายเลข 1002 สะท้อนให้เห็น เนื่องจากบล็อกดังกล่าวถูกสร้างเป็นธุรกรรมแยกต่างหากและบันทึกไว้ในตอนท้าย
  • ดังนั้น โดยไม่คำนึงถึงการบันทึก/ทิ้งในธุรกรรมหลัก การเปลี่ยนแปลงในธุรกรรมอัตโนมัติจะได้รับการบันทึก โดยไม่กระทบต่อการเปลี่ยนแปลงธุรกรรมหลัก