ใน Oracle Database การทำ Transaction จะยึดหลักการ ACID โดยปกติแล้ว Transaction จะเริ่มต้นขึ้นโดยอัตโนมัติเมื่อคุณใช้คำสั่ง DML และจะสิ้นสุดลงเมื่อมีการสั่ง COMMIT หรือ ROLLBACK
คำสั่งพื้นฐาน
COMMIT: บันทึกการเปลี่ยนแปลงถาวรลง DatabaseROLLBACK: ยกเลิกการเปลี่ยนแปลงทั้งหมดใน 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;
ข้อควรระวัง
- Implicit Commit: คำสั่งประเภท DDL จะทำการ
COMMITให้อัตโนมัติทันที คุณไม่สามารถ Rollback คำสั่งเหล่านี้ได้ - Locks: เมื่อเริ่ม Transaction Oracle จะทำการ Lock Row นั้นไว้ทันที คนอื่นจะไม่สามารถแก้ไขได้จนกว่าคุณจะ
COMMITหรือROLLBACKดังนั้นควรทำให้ Transaction สั้นที่สุด - Read Consistency: ในระหว่างที่คุณยังไม่ Commit คนอื่นที่ Query ข้อมูลจะยังเห็นข้อมูลชุดเก่าอยู่
อ่านเพิ่มเติม