การทำธุรกรรมอัตโนมัติใน 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 สะท้อนให้เห็น เนื่องจากบล็อกดังกล่าวถูกสร้างเป็นธุรกรรมแยกต่างหากและบันทึกไว้ในตอนท้าย
- ดังนั้น โดยไม่คำนึงถึงการบันทึก/ทิ้งในธุรกรรมหลัก การเปลี่ยนแปลงในธุรกรรมอัตโนมัติจะได้รับการบันทึก โดยไม่กระทบต่อการเปลี่ยนแปลงธุรกรรมหลัก