คุณสมบัติ ACID และความผิดปกติ
ทบทวนความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน ความคงทน และความผิดปกติแบบคลาสสิกทั้งสี่ ได้แก่ การอ่านข้อมูลสกปรก การอ่านซ้ำไม่ได้ ข้อมูลภาพหลอน และการอัปเดตที่สูญหาย
คุณสมบัติ ACID และความผิดปกติ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ACID
ธุรกรรมจะมีความน่าเชื่อถือเมื่อมีคุณสมบัติดังนี้:
- เป็นหนึ่งเดียว — ทำทั้งหมดหรือไม่ทำเลย
- สอดคล้อง — เปลี่ยนฐานข้อมูลจากสถานะที่ถูกต้องหนึ่งสถานะไปเป็นอีกสถานะที่ถูกต้อง
- แยกออกจากกัน — ธุรกรรมที่ทำงานพร้อมกันไม่รบกวนกัน
- คงทน — เมื่อยืนยันแล้ว ข้อมูลจะยังคงอยู่แม้ระบบจะขัดข้อง
ธุรกรรมในภาษาเอสคิวแอล
ครอบการดำเนินการด้วย BEGIN ... COMMIT:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- If anything fails, ROLLBACK leaves both rows unchanged.ความเป็นหนึ่งเดียวในการทำงาน
หาก UPDATE รายการที่สองล้มเหลว รายการแรกจะถูกย้อนกลับด้วย ข้อมูลจะไม่สูญหายไปเพียงบางส่วน:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Crash here, or ROLLBACK: account 1 is unchanged.ความสอดคล้อง
ข้อจำกัด (NOT NULL, CHECK, FK) จะถูกตรวจสอบเมื่อยืนยัน ธุรกรรมที่อาจทำให้ฐานข้อมูลอยู่ในสถานะไม่ถูกต้องจะล้มเหลว:
BEGIN;
INSERT INTO orders (user_id, total) VALUES (999, 100); -- FK fails on commit if user 999 doesn't exist.
COMMIT;
-- ERROR: insert or update violates foreign key constraint
-- ROLLBACK happens automatically.เหตุใดการแยกธุรกรรมจึงสำคัญ
ธุรกรรมที่ทำงานพร้อมกันสองรายการอาจทำให้มุมมองข้อมูลของกันและกันเสียหายได้หากไม่มีการแยกธุรกรรม ความผิดปกติที่พบได้บ่อยมีดังนี้:
- การอ่านข้อมูลสกปรก — อ่านข้อมูลที่ยังไม่ได้ยืนยัน
- การอ่านซ้ำแล้วได้ผลต่างกัน — query เดิมให้แถวต่างกัน
- แถวแฝง — มีแถวใหม่ปรากฏขึ้นระหว่างธุรกรรม
- การอัปเดตสูญหาย — การอัปเดตสองรายการเขียนทับกัน
การอ่านข้อมูลสกปรก
การอ่านแถวที่ธุรกรรมอื่นแก้ไขแล้วแต่ยังไม่ได้ยืนยัน PostgreSQL ป้องกันกรณีนี้ในทุกระดับการแยกธุรกรรม
การอ่านซ้ำแล้วได้ผลต่างกัน
คุณอ่านแถวที่ 1 จากนั้นธุรกรรมอื่นยืนยันการอัปเดตแถวที่ 1 แล้วคุณอ่านซ้ำ ค่าอ่านที่ได้จะแตกต่างจากเดิม
การอ่านแถวแฝง
คุณเรียกใช้ SELECT COUNT(*) สองครั้งในธุรกรรมเดียวกัน ระหว่างการเรียกใช้ทั้งสองครั้ง ธุรกรรมอื่นยืนยัน INSERT ทำให้จำนวนครั้งที่สองมากกว่าเดิม
การอัปเดตสูญหาย
ธุรกรรมสองรายการอ่านค่า balance=100 พร้อมกัน จากนั้นเขียนค่า balance=balance-50 และยืนยันทั้งคู่ ทำให้หนึ่งในการลดลง 50 สูญหายไป
ความคงทน
เมื่อ COMMIT ส่งคืนแล้ว การเปลี่ยนแปลงจะถูกเขียนลงดิสก์ (หรือจำลองไปยังเครื่องอื่น ทั้งนี้ขึ้นอยู่กับการตั้งค่า) แม้ระบบจะขัดข้องในอีกหนึ่งมิลลิวินาทีถัดมา การเปลี่ยนแปลงนั้นก็จะไม่สูญหาย PostgreSQL ทำให้ข้อมูลมีความคงทนผ่าน WAL (การบันทึกล่วงหน้า)
การยืนยันอัตโนมัติ
โดยค่าเริ่มต้น แต่ละคำสั่งจะเป็นธุรกรรมของตัวเอง:
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- Implicitly: BEGIN; statement; COMMIT;SAVEPOINT
การย้อนกลับบางส่วนภายในธุรกรรม:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT before_step2;
UPDATE accounts SET balance = balance + 100 WHERE id = 999;
-- ERROR — but we can recover:
ROLLBACK TO SAVEPOINT before_step2;
-- continue
COMMIT;สรุปทบทวน
ธุรกรรมคือกลไกป้องกันความเสียหายของฐานข้อมูลเชิงสัมพันธ์
- ACID: เป็นหนึ่งเดียว สอดคล้อง แยกออกจากกัน และคงทน
- ความผิดปกติที่พบได้บ่อยสี่ประเภท
- BEGIN ... COMMIT หรือ ROLLBACK
- SAVEPOINT สำหรับการย้อนกลับบางส่วน
แบบทดสอบสั้น ๆ
ความผิดปกติใดเกิดขึ้นเมื่อธุรกรรมสองรายการอ่านค่าเดียวกัน แก้ไขค่านั้น แล้ว COMMIT ทั้งคู่
คำถามที่พบบ่อย
บทเรียน “คุณสมบัติ ACID และความผิดปกติ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คุณสมบัติ ACID และความผิดปกติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คุณสมบัติ ACID และความผิดปกติ”
ทบทวนความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน ความคงทน และความผิดปกติแบบคลาสสิกทั้งสี่ ได้แก่ การอ่านข้อมูลสกปรก การอ่านซ้ำไม่ได้ ข้อมูลภาพหลอน และการอัปเดตที่สูญหาย คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “คุณสมบัติ ACID และความผิดปกติ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คุณสมบัติ ACID และความผิดปกติ
- ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- เดดล็อก: การตรวจจับและการหลีกเลี่ยง
- การล็อกแบบมองโลกในแง่ดีเทียบกับแบบระมัดระวัง