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

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

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

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