Oracle: Translaction

ใน Oracle Database การทำ Transaction จะยึดหลักการ ACID โดยปกติแล้ว Transaction จะเริ่มต้นขึ้นโดยอัตโนมัติเมื่อคุณใช้คำสั่ง DML และจะสิ้นสุดลงเมื่อมีการสั่ง COMMIT หรือ ROLLBACK


คำสั่งพื้นฐาน

  • COMMIT: บันทึกการเปลี่ยนแปลงถาวรลง Database
  • ROLLBACK: ยกเลิกการเปลี่ยนแปลงทั้งหมดใน Transaction นั้น กลับไปจุดเริ่มต้น
  • SAVEPOINT name: กำหนดจุด “บันทึกชั่วคราว” ภายใน Transaction เพื่อให้ถอยกลับมาแค่จุดนี้ได้โดยไม่ต้องย้อนไปทั้งหมด

ตัวอย่างการเขียนใน PL/SQL

การเขียน Transaction ใน Oracle มักจะใช้ BEGIN...END; และควรมีการจัดการ Error ด้วย EXCEPTION เพื่อความปลอดภัยของข้อมูล

BEGIN -- 1. เริ่มคำสั่งแรก UPDATE accounts SET balance = balance - 500 WHERE acc_id = 101; -- 2. สร้าง Savepoint (เผื่อคำสั่งถัดไปมีปัญหาแต่ไม่อยากยกเลิกคำสั่งแรก) SAVEPOINT sp_after_withdrawal; -- 3. คำสั่งที่สอง UPDATE accounts SET balance = balance + 500 WHERE acc_id = 102; -- หากทุกอย่างทำงานถูกต้อง ให้บันทึกถาวร COMMIT; DBMS_OUTPUT.PUT_LINE ('Transaction Completed Successfully') ; EXCEPTION WHEN OTHERS THEN -- หากเกิด Error ใด ๆ ให้ถอยกลับ (Rollback) ทั้งหมด ROLLBACK; DBMS_OUTPUT.PUT_LINE ('Transaction Failed: Rolling back changes') ; RAISE; -- ส่งต่อ Error ออกไปเพื่อให้ระบบรู้ว่ามีปัญหา
END;

การใช้ Savepoint เพื่อ Rollback บางส่วน

หากคุณต้องการ Rollback เฉพาะจุด ให้ใช้ ROLLBACK TO

BEGIN INSERT INTO logs (action) VALUES ('Start Process') ; SAVEPOINT start_point; UPDATE products SET stock = stock - 1 WHERE prod_id = 99; -- สมมติว่ามีเงื่อนไขเช็คบางอย่างแล้วไม่ผ่าน IF (stock_is_negative) THEN ROLLBACK TO start_point; -- ย้อนกลับไปแค่จุดหลัง insert log END IF; COMMIT;
END;

ข้อควรระวัง

  1. Implicit Commit: คำสั่งประเภท DDL จะทำการ COMMIT ให้อัตโนมัติทันที คุณไม่สามารถ Rollback คำสั่งเหล่านี้ได้
  2. Locks: เมื่อเริ่ม Transaction Oracle จะทำการ Lock Row นั้นไว้ทันที คนอื่นจะไม่สามารถแก้ไขได้จนกว่าคุณจะ COMMIT หรือ ROLLBACK ดังนั้นควรทำให้ Transaction สั้นที่สุด
  3. Read Consistency: ในระหว่างที่คุณยังไม่ Commit คนอื่นที่ Query ข้อมูลจะยังเห็นข้อมูลชุดเก่าอยู่

อ่านเพิ่มเติม