อธิบายคุณสมบัติ ACID
เรียนรู้ความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน และความคงทนผ่านตัวอย่างที่เป็นรูปธรรม
อธิบายคุณสมบัติ ACID เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding 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 balanceC = ความสอดคล้อง
ความสอดคล้องหมายความว่าธุรกรรมจะเปลี่ยนฐานข้อมูลจากสถานะที่ถูกต้องสถานะหนึ่งไปเป็นอีกสถานะที่ถูกต้องหนึ่ง ทุกธุรกรรมที่ยืนยันผลแล้วต้องเคารพกฎทั้งหมดที่กำหนดไว้ ได้แก่ ข้อจำกัด คีย์ต่างประเทศ ตัวกระตุ้น และการดำเนินการแบบต่อเนื่อง
หากธุรกรรมจะทำให้ข้อจำกัดถูกละเมิด เช่น คีย์ต่างประเทศที่ไม่มีข้อมูลต้นทาง คีย์หลักซ้ำ หรือ 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 COMMITTEDREPEATABLE READSERIALIZABLEเข้มงวดที่สุด
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) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “อธิบายคุณสมบัติ ACID”
เรียนรู้ความเป็นอะตอม ความสอดคล้อง การแยกออกจากกัน และความคงทนผ่านตัวอย่างที่เป็นรูปธรรม คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “อธิบายคุณสมบัติ ACID” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อธิบายคุณสมบัติ ACID
- ระดับการแยกออกจากกันทั้งสี่ระดับ
- การอ่านข้อมูลสกปรก การอ่านซ้ำไม่ได้ และการอ่านข้อมูลแฝง
- ภาวะติดตาย การล็อก และ MVCC