ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
เปรียบเทียบระดับการแยกตามมาตรฐาน SQL การนำไปใช้ใน PostgreSQL และเลือกระดับที่เหมาะกับภาระงานของคุณ
ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ระดับมาตรฐานสี่ระดับ
มาตรฐานเอสคิวแอลกำหนดระดับการแยกธุรกรรมไว้สี่ระดับ:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
PostgreSQL รองรับสามระดับ (READ UNCOMMITTED ทำงานเหมือน READ COMMITTED)
READ COMMITTED (ค่าเริ่มต้นของ PostgreSQL)
แต่ละคำสั่งจะเห็นข้อมูลที่ยืนยันแล้วก่อนเริ่มคำสั่งนั้น คุณอาจเห็นภาพรวมข้อมูลที่แตกต่างกันภายในธุรกรรมเดียวกัน
-- Inside one transaction:
SELECT balance FROM accounts WHERE id = 1; -- 100
-- meanwhile another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1; -- 200 (non-repeatable read)REPEATABLE READ (การแยกด้วยภาพรวมข้อมูล)
ใช้ภาพรวมข้อมูลที่สร้างขึ้นเมื่อเริ่มธุรกรรม การอ่านแถวเดิมซ้ำจะคืนค่าเดิมเสมอ REPEATABLE READ ของ PostgreSQL ยังป้องกันแถวแฝงได้ด้วย
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1; -- 100
-- another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1; -- still 100
COMMIT;SERIALIZABLE
แข็งแกร่งที่สุด: ทำงานเสมือนว่าธุรกรรมดำเนินการทีละรายการ PostgreSQL ใช้การแยกภาพรวมข้อมูลแบบ SERIALIZABLE (SSI) เพื่อตรวจจับการพึ่งพากันระหว่างธุรกรรมที่ทำงานพร้อมกัน และยกเลิกธุรกรรมที่ขัดแย้งกัน:
BEGIN ISOLATION LEVEL SERIALIZABLE;
...
COMMIT;
-- ERROR: could not serialize access due to read/write dependenciesการกำหนดระดับการแยกธุรกรรม
กำหนดได้ต่อธุรกรรม ต่อเซสชัน หรือกำหนดเป็นค่าทั่วทั้งระบบ:
-- Per transaction:
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- Per session:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Default for new transactions in this session:
SET default_transaction_isolation = 'repeatable read';
-- Global default in postgresql.conf:
-- default_transaction_isolation = 'read committed'ความผิดปกติที่แต่ละระดับยอมให้เกิดขึ้น
| ระดับ | การอ่านข้อมูลสกปรก | การอ่านซ้ำไม่เหมือนเดิม | แถวแฝง |
|---|---|---|---|
| READ UNCOMMITTED | อาจเกิดขึ้น | อาจเกิดขึ้น | อาจเกิดขึ้น |
| READ COMMITTED | ไม่เกิดขึ้น | อาจเกิดขึ้น | อาจเกิดขึ้น |
| REPEATABLE READ | ไม่เกิดขึ้น | ไม่เกิดขึ้น | ไม่เกิดขึ้น (ใน PG) |
| SERIALIZABLE | ไม่เกิดขึ้น | ไม่เกิดขึ้น | ไม่เกิดขึ้น |
ข้อแลกเปลี่ยนด้านประสิทธิภาพ
- READ COMMITTED — มีค่าใช้จ่ายเพิ่มเติมน้อยที่สุดและเป็นค่าเริ่มต้น
- REPEATABLE READ — ใช้แผนเดียวกันและให้ภาพรวมข้อมูลที่สอดคล้องกัน โดยไม่มีผลกระทบต่อประสิทธิภาพ เว้นแต่การเขียนจะขัดแย้งกัน
- SERIALIZABLE — ต้องเก็บข้อมูลประกอบเพิ่มเติมและอาจยกเลิกธุรกรรม แอปจึงต้องมีตรรกะสำหรับลองใหม่
รูปแบบการลองใหม่สำหรับ Serializable
SERIALIZABLE อาจยกเลิกธุรกรรมด้วยรหัส 40001 ให้ลองใหม่เป็นวงวน:
for (let i = 0; i < 3; i++) {
try {
await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
// ... work ...
await client.query('COMMIT');
break;
} catch (e) {
if (e.code === '40001') continue;
throw e;
}
}การอ่านภาพรวมข้อมูลที่สอดคล้องกัน
สำหรับ query เชิงวิเคราะห์ที่ใช้เวลานานและต้องการข้อมูลที่สอดคล้องกัน REPEATABLE READ เป็นจุดสมดุลที่เหมาะสม
พฤติกรรมเมื่อการเขียนขัดแย้งกัน
หากธุรกรรมสองรายการแก้ไขแถวเดียวกัน:
- READ COMMITTED — รายการที่สองจะรอ จากนั้นอ่านแถวใหม่อีกครั้งและลองดำเนินการต่อ
- REPEATABLE READ — รายการที่สองจะถูกยกเลิกพร้อมข้อความ "could not serialize" แอปต้องลองใหม่
เลือกระดับให้เหมาะสม
หลักทั่วไป:
- OLTP — READ COMMITTED (ค่าเริ่มต้น)
- รายงานที่ต้องการความสอดคล้อง — REPEATABLE READ
- เงินหรือสินค้าคงคลัง — SERIALIZABLE พร้อมลองใหม่ หรือใช้การล็อกอย่างชัดเจน (FOR UPDATE)
บางครั้งการล็อกอย่างชัดเจนดีกว่าการแยกธุรกรรม
บ่อยครั้ง การใช้ SELECT ... FOR UPDATE บน READ COMMITTED จะเรียบง่ายกว่า SERIALIZABLE สำหรับแถวเดียวที่มีการใช้งานหนาแน่น
สรุปทบทวน
ระดับการแยกธุรกรรมแลกเปลี่ยนระหว่างความปลอดภัยกับการทำงานพร้อมกัน
- READ COMMITTED เป็นค่าเริ่มต้น
- REPEATABLE READ สำหรับการอ่านที่สอดคล้องกัน
- SERIALIZABLE สำหรับการทำงานเสมือนทีละรายการ ต้องมีตรรกะสำหรับลองใหม่
แบบทดสอบสั้น ๆ
ระดับการแยกธุรกรรมใดเป็นค่าเริ่มต้นของ PostgreSQL
คำถามที่พบบ่อย
บทเรียน “ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE”
เปรียบเทียบระดับการแยกตามมาตรฐาน SQL การนำไปใช้ใน PostgreSQL และเลือกระดับที่เหมาะกับภาระงานของคุณ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คุณสมบัติ ACID และความผิดปกติ
- ระดับการแยก: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- เดดล็อก: การตรวจจับและการหลีกเลี่ยง
- การล็อกแบบมองโลกในแง่ดีเทียบกับแบบระมัดระวัง