0Pricing
SQL Interview Prep · บทเรียน

อธิบายคุณสมบัติ ACID

เรียนรู้ความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน และความคงทนผ่านตัวอย่างที่เป็นรูปธรรม

อธิบายคุณสมบัติ ACID เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เหตุผลที่ผู้สัมภาษณ์ถามเรื่อง ACID

เมื่อผู้สัมภาษณ์อาวุโสพูดว่า "อธิบาย ACID ให้ผมฟังทีละขั้นตอน" เขาไม่ได้ทดสอบว่าคุณท่องจำคำสี่คำได้หรือไม่ แต่ต้องการรู้ว่าคุณเข้าใจหรือไม่ว่าฐานข้อมูล รับรองสิ่งใดเมื่อมีผู้ใช้จำนวนมากเข้าถึงพร้อมกัน

ACID ย่อมาจาก ความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน และความคงทน ฐานข้อมูลที่รองรับธุรกรรมทุกระบบ (PostgreSQL, MySQL/InnoDB, เซิร์ฟเวอร์ SQL, ออราเคิล) รับรองคุณสมบัติทั้งสี่ประการนี้สำหรับงานที่ครอบไว้ในธุรกรรม

คำตอบที่ดีที่สุดจะเชื่อมโยงตัวอักษรแต่ละตัวเข้ากับความล้มเหลวที่เป็นรูปธรรมซึ่งคุณสมบัตินั้นช่วยป้องกัน ในส่วนถัดไปเราจะทำเช่นนั้นอย่างครบถ้วน

ธุรกรรมคืออะไร

ธุรกรรมคือหน่วยของงานที่ฐานข้อมูลปฏิบัติต่อเสมือนเป็นขั้นตอนเดียวที่แบ่งแยกไม่ได้ คุณเริ่มธุรกรรมด้วย BEGIN ดำเนินการคำสั่งหนึ่งคำสั่งหรือมากกว่านั้น จากนั้นใช้ COMMIT เพื่อทำให้การเปลี่ยนแปลงมีผลถาวร หรือใช้ ROLLBACK เพื่อยกเลิกทุกอย่าง

ตัวอย่างคลาสสิกคือการโอนเงินผ่านธนาคาร: หักเงินจากบัญชีหนึ่งและเติมเงินให้อีกบัญชีหนึ่ง ทั้งสองรายการต้องเกิดขึ้นพร้อมกัน มิฉะนั้นต้องไม่เกิดขึ้นเลย ธุรกรรมคือตัวห่อหุ้มที่ช่วยให้คุณรับรองเงื่อนไขนี้ได้

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

A = ความเป็นอะตอม

ความเป็นอะตอมหมายความว่าธุรกรรมต้องสำเร็จทั้งหมดหรือไม่สำเร็จเลย หากคำสั่งใดคำสั่งหนึ่งล้มเหลว หรือเซิร์ฟเวอร์หยุดทำงานระหว่างทาง การเปลี่ยนแปลงทุกอย่างในธุรกรรมนั้นจะถูกย้อนกลับเสมือนว่าไม่เคยเริ่มต้น

ในตัวอย่างการโอนเงิน หากการเติมเงินล้มเหลวหลังจากหักเงินสำเร็จ ความเป็นอะตอมรับรองว่าการหักเงินจะถูกยกเลิกด้วย คุณจะไม่สูญเสียเงินจากการดำเนินการที่เสร็จเพียงครึ่งเดียว

ถ้อยคำสำหรับการสัมภาษณ์: "ความเป็นอะตอมรับรองว่าธุรกรรมจะยืนยันผลทั้งหมดในคราวเดียวหรือไม่ยืนยันเลย จึงไม่เหลือสถานะบางส่วน"

ความเป็นอะตอมในการทำงานจริง

ในที่นี้ การอัปเดตครั้งที่สองละเมิดข้อจำกัดการตรวจสอบ (ยอดคงเหลือต้องไม่ติดลบ) ฐานข้อมูลจึงยกเลิกธุรกรรม และ ROLLBACK จะย้อนกลับการอัปเดตครั้งแรกด้วย

ประเด็นสำคัญสำหรับการสัมภาษณ์คือ หลังการย้อนกลับ บัญชี 1 ยังคงมียอดคงเหลือเดิม ไม่มีการเขียนข้อมูลบางส่วนค้างอยู่ในตาราง

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- next line fails: balance would go below 0
UPDATE accounts SET balance = balance - 999999 WHERE id = 2;
ROLLBACK;  -- account 1 is restored to its original balance

C = ความสอดคล้อง

ความสอดคล้องหมายความว่าธุรกรรมจะเปลี่ยนฐานข้อมูลจากสถานะที่ถูกต้องสถานะหนึ่งไปเป็นอีกสถานะที่ถูกต้องหนึ่ง ทุกธุรกรรมที่ยืนยันผลแล้วต้องเคารพกฎทั้งหมดที่กำหนดไว้ ได้แก่ ข้อจำกัด คีย์ต่างประเทศ ตัวกระตุ้น และการดำเนินการแบบต่อเนื่อง

หากธุรกรรมจะทำให้ข้อจำกัดถูกละเมิด เช่น คีย์ต่างประเทศที่ไม่มีข้อมูลต้นทาง คีย์หลักซ้ำ หรือ CHECK ล้มเหลว ฐานข้อมูลจะไม่ยอมยืนยันธุรกรรมนั้น

ประเด็นที่ควรกล่าวถึง: ฐานข้อมูลบังคับใช้กฎที่ประกาศไว้ แต่เงื่อนไขคงความถูกต้องในระดับแอปพลิเคชัน เช่น "ผู้ใช้หนึ่งคนมีเซสชันที่ใช้งานอยู่ได้ไม่เกิน 3 เซสชัน" เป็นหน้าที่ของคุณ เว้นแต่จะจำลองเงื่อนไขนั้นเป็นข้อจำกัด

ความสอดคล้องที่บังคับใช้ด้วยข้อจำกัด

ความสอดคล้องส่วนใหญ่เกิดจากผลรวมของกฎในโครงสร้างฐานข้อมูล ด้านล่างนี้ คีย์ต่างประเทศรับรองว่าคุณจะไม่สามารถเพิ่มคำสั่งซื้อของลูกค้าที่ไม่มีอยู่จริงได้

หากการเพิ่มข้อมูลอ้างอิงถึงลูกค้าที่ไม่มีอยู่ ธุรกรรมจะล้มเหลว ความเป็นอะตอมจะย้อนกลับธุรกรรมนั้น และความสอดคล้องจะยังคงอยู่ นี่คือเหตุผลที่ผู้สัมภาษณ์กล่าวว่าความเป็นอะตอมและความสอดคล้องทำงานร่วมกัน

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL REFERENCES customers(id),
  amount NUMERIC(10,2) CHECK (amount > 0)
);

-- This fails if customer 999 does not exist, keeping data consistent
INSERT INTO orders (id, customer_id, amount) VALUES (1, 999, 50.00);

I = การแยกธุรกรรม

การแยกธุรกรรมหมายความว่าธุรกรรมที่ทำงานพร้อมกันจะไม่รบกวนกัน ตามหลักแล้ว แต่ละธุรกรรมควรทำงานเสมือนว่าเป็นธุรกรรมเดียวที่ทำงานลำพัง แม้จะมีหลายสิบธุรกรรมทำงานพร้อมกัน

ในทางปฏิบัติ ฐานข้อมูลมีระดับการแยกธุรกรรมหลายระดับ ซึ่งแลกเปลี่ยนความเข้มงวดกับประสิทธิภาพ ระดับที่อ่อนกว่าจะยอมให้เกิดความผิดปกติบางอย่าง เช่น การอ่านข้อมูลที่ยังไม่ยืนยันและการอ่านพบแถวใหม่ เพื่อแลกกับการรองรับธุรกรรมพร้อมกันที่มากขึ้น

นี่เป็นส่วนที่มีรายละเอียดมากที่สุดในการสัมภาษณ์เรื่อง ACID ดังนั้นบทเรียนสองบทถัดไปจะอธิบายระดับการแยกธุรกรรมและความผิดปกติจากการอ่านอย่างละเอียด

เหตุใดการแยกธุรกรรมจึงเป็นช่วงระดับ

การแยกธุรกรรมอย่างสมบูรณ์ (SERIALIZABLE) มีต้นทุนสูง เพราะต้องป้องกันความขัดแย้งจากการสลับลำดับการทำงานที่เป็นไปได้ทุกแบบ ซึ่งมักทำโดยการล็อกหรือยกเลิกธุรกรรม

ดังนั้น มาตรฐานเอสคิวแอลจึงกำหนดไว้สี่ระดับ ข้อผิดพลาดที่มักพบในการสัมภาษณ์คือ ผู้สมัครคิดว่าการแยกธุรกรรมมีเพียงสองทางเลือก แต่ไม่ใช่เช่นนั้น คุณต้องเลือกระดับที่ต้องการอย่างชัดเจน

  • READ UNCOMMITTED อ่อนที่สุด
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE เข้มงวดที่สุด
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
-- ... business logic ...
COMMIT;

D = ความคงทน

ความคงทนหมายความว่า เมื่อธุรกรรมยืนยันผลแล้ว การเปลี่ยนแปลงของธุรกรรมนั้นจะคงอยู่แม้เกิดการหยุดทำงาน ไฟฟ้าดับ หรือเริ่มระบบใหม่ ธุรกรรมที่ยืนยันผลแล้วจะถูกบันทึกอยู่ในพื้นที่จัดเก็บถาวร

ฐานข้อมูลทำให้เกิดคุณสมบัตินี้ด้วยบันทึกแบบเขียนล่วงหน้า (WAL) โดยเขียนการเปลี่ยนแปลงลงในบันทึกถาวรก่อนอัปเดตไฟล์ข้อมูล เมื่อเริ่มระบบใหม่ ระบบประมวลผลจะเล่นบันทึกนั้นซ้ำเพื่อกู้คืนงานที่ยืนยันผลแล้วแต่ยังไม่ได้ถูกเขียนลงในไฟล์หลัก

ถ้อยคำสำหรับการสัมภาษณ์: "ความคงทนรับรองด้วย WAL โดยการยืนยันผลจะส่งกลับก็ต่อเมื่อระเบียนบันทึกถูกเขียนลงดิสก์เรียบร้อยแล้ว"

รวมตัวอย่างการโอนเงินผ่านธนาคาร

การโอนเงินหนึ่งรายการแสดงคุณสมบัติทั้งสี่พร้อมกัน:

  • ความเป็นอะตอม: การอัปเดตทั้งสองรายการมีผลพร้อมกัน หรือไม่เกิดขึ้นเลย
  • ความสอดคล้อง: CHECK ทำให้ยอดคงเหลือไม่ติดลบ
  • การแยกธุรกรรม: ผู้อ่านที่ทำงานพร้อมกันจะไม่เห็นการโอนเงินที่เสร็จเพียงครึ่งเดียว
  • ความคงทน: หลัง COMMIT ยอดคงเหลือใหม่จะยังคงอยู่แม้ระบบหยุดทำงาน

การเชื่อมโยงตัวอย่างเดียวเข้ากับตัวอักษรทั้งสี่ได้ คือสิ่งที่ช่วยทำคะแนนในการสัมภาษณ์ได้อย่างตรงจุด

BEGIN;
UPDATE accounts SET balance = balance - 100
  WHERE id = 1 AND balance >= 100;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

คำถามต่อยอดที่พบบ่อย

ผู้สัมภาษณ์มักถามเจาะลึกถึงกรณีขอบเขตต่าง ๆ โปรดเตรียมพร้อมสำหรับคำถามเหล่านี้:

  • "คีย์ต่างประเทศบังคับใช้คุณสมบัติใด" ความสอดคล้อง
  • "อะไรป้องกันปัญหาจากเซิร์ฟเวอร์หยุดทำงานระหว่างธุรกรรม" ความเป็นอะตอม (ย้อนกลับสิ่งที่ยังไม่ยืนยัน) รวมกับความคงทน (เล่นสิ่งที่ยืนยันผลแล้วซ้ำเพื่อกู้คืน)
  • "การแยกธุรกรรมไม่มีต้นทุนใช่หรือไม่" ไม่ใช่ การแยกธุรกรรมที่เข้มงวดขึ้นมีต้นทุนเป็นความสามารถในการทำงานพร้อมกันที่ลดลง
  • "ฐานข้อมูล NoSQL มี ACID หรือไม่" หลายระบบยอมแลก ACID กับความพร้อมใช้งาน (BASE) ควรตอบว่าขึ้นอยู่กับระบบประมวลผลนั้น

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจว่าคุณสมบัติใดของ ACID ทำหน้าที่อะไร

สรุป: ACID ในคำตอบเดียว

ตอนนี้คุณสามารถตอบคำถามนี้ได้อย่างชัดเจน:

  • ความเป็นอะตอม - สำเร็จทั้งหมดหรือไม่สำเร็จเลย งานที่ทำไปบางส่วนจะถูกย้อนกลับ
  • ความสอดคล้อง - การยืนยันผลทุกครั้งเคารพข้อจำกัดและทำให้ฐานข้อมูลอยู่ในสถานะที่ถูกต้อง
  • การแยกธุรกรรม - ธุรกรรมที่ทำงานพร้อมกันจะไม่ทำให้ข้อมูลของกันและกันเสียหาย โดยสามารถปรับระดับความเข้มงวดได้
  • ความคงทน - ข้อมูลที่ยืนยันผลแล้วจะยังคงอยู่แม้ระบบหยุดทำงาน โดยมีบันทึกแบบเขียนล่วงหน้าคอยรองรับ

เชื่อมโยงตัวอักษรแต่ละตัวเข้ากับความล้มเหลวที่คุณสมบัตินั้นป้องกันได้ แล้วคุณจะตอบคำถามช่วงต้นของการสัมภาษณ์เรื่องการทำงานพร้อมกันได้อย่างมั่นใจ

คำถามที่พบบ่อย

บทเรียน “อธิบายคุณสมบัติ ACID” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “อธิบายคุณสมบัติ ACID” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “อธิบายคุณสมบัติ ACID”

เรียนรู้ความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน และความคงทนผ่านตัวอย่างที่เป็นรูปธรรม คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “อธิบายคุณสมบัติ ACID” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม

ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. อธิบายคุณสมบัติ ACID
  2. ระดับการแยกออกจากกันทั้งสี่ระดับ
  3. การอ่านข้อมูลสกปรก การอ่านซ้ำไม่ได้ และการอ่านข้อมูลแฝง
  4. ภาวะติดตาย การล็อก และ MVCC
← กลับไปที่ SQL Interview Prep