0Pricing
SQL Academy · บทเรียน

คุณสมบัติ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คุณสมบัติ ACID และความผิดปกติ
  2. ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. เดดล็อก: การตรวจจับและการหลีกเลี่ยง
  4. การล็อกแบบมองโลกในแง่ดีเทียบกับแบบระมัดระวัง
← กลับไปที่ SQL Academy