ข้าม​ไป​ยัง​เนื้อหา

ทำไม​ต้อง​มี isolation level — สร้าง transaction manager เอง

ผู้​ใช้​คน​เดียว​ไม่​ต้องการ isolation level เลย ปัญหา​ทั้งหมด​เริ่ม​ตอน​มี​คน​ที่​สอง — และ​คำ​ตอบ​ที่​ผิด​จะ​ไม่​แจ้ง​เตือน​คุณ มัน​แค่​ผิด​เงียบๆ คอร์ส​นี้​พาสร้าง transaction manager ตั้งแต่​ศูนย์​ด้วย Rust standard library ล้วน จน​คุณ​สาธิต anomaly แต่ละ​ชนิด​ได้​เอง​แบบ​เดิม​ทุก​ครั้ง แล้ว​เห็น​กับ​ตา​ว่า​แต่ละ isolation level ซื้อ​อะไร​และ​จ่าย​ด้วย​อะไร สิ่ง​ที่​คอร์ส​นี้​ยืนยัน​สวน​ความ​เชื่อ​ทั่วไป​คือ ระดับ​ที่​สูง​ขึ้น​ไม่​ได้​ทำให้​คำ​ตอบ​ถูก​ขึ้น serializable ไม่​ได้​แก้​ยอด​ที่​หาย​ไป​ให้​กลับ​มา​ถูก มัน​คืน abort กลับ​มา​ให้​คุณ retry เอง หน่วย​วัด​ของ​คอร์ส​จึง​เป็น​จำนวน abort จำนวน version ที่​ค้าง​อยู่ และ​จำนวน​หน้าที่​เขียน​ลง disk ไม่ใช่​วินาที 8 บท​ลงมือ​จริง
ความคืบหน้า0 / 8 บทเรียน

ต้อง​มี Rust ระดับ​อ่าน​ออก​และ​คอมไพล์​เอง​ได้ ส่วน​ความ​รู้เรื่อง​ภายใน​ฐาน​ข้อมูล​ไม่​ต้อง​มี​มา​ก่อน

  • Rust ระดับ​ที่​ผ่าน ownership กับ borrow มา​แล้ว ไม่​ต้อง​เชี่ยวชาญ แต่​ต้อง​เคย​เขียน​จน​คอมไพล์​ผ่าน เอง ทั้ง​คอร์ส​ใช้ standard library ล้วน จึง​ไม่​ต้อง​ติดตั้ง​อะไร​เพิ่ม​นอกจาก toolchain
  • SQL ระดับ​ใช้งาน​พอ เขียน SELECT กับ UPDATE เป็น​ก็​พอแล้ว คอร์ส​นี้​ไม่​ได้​สอน SQL และ​ไม่​ต้อง​รู้จัก isolation level มา​ก่อน​เลย​สัก​ระดับ
  • ไม่​ต้อง​เรียน​คอร์ส query engine มา​ก่อน สอง​คอร์ส​นี้​อยู่​เสา​เดียวกัน​และ​ต่อ​กัน​ใน​เชิง​เรื่อง แต่​ไม่​ได้​ต่อ​กัน​ที่ code เริ่ม​จาก file เปล่า​ได้​เลย
  • ถ้า​มา​ด้วย​อาการ “ยอด​ใน​ระบบ​ไม่​ตรง​กับ​ที่​ควร​เป็น แต่​หา bug ไม่​เจอ” คุณ​มา​ถูก​ที่​แล้ว บท​ที่ 2 จะ​ทำ​อาการ​นั้น​ให้​ดู​ซ้ำ​ได้​ทุก​ครั้ง

เส้น​ขอบเขต — คอร์ส​นี้​สร้าง​อะไร และ​ไม่​สร้าง​อะไร

หัวข้อ​ที่​มีชื่อ​ว่า “เส้น​ขอบเขต — คอร์ส​นี้​สร้าง​อะไร และ​ไม่​สร้าง​อะไร”

หัวข้อ​นี้​ประกาศ​ขอบเขต​ล่วงหน้า เพื่อ​ไม่​ให้​ใคร​อ่าน​จบ​แล้ว​รู้สึก​ว่า​ถูก​สัญญา​เกิน​จริง

สิ่ง​ที่​ได้​เมื่อ​จบ​คือ transaction manager ที่​รัน​ได้​จริง มี​ทั้ง locking และ MVCC เลือก isolation level ได้ และ​สาธิต anomaly แต่ละ​ชนิด​ได้​แบบ​เดิม​ทุก​ครั้ง

หน่วย​ของ​คอร์ส​นี้​คือ​จำนวนนับ ไม่ใช่​วินาที — จำนวน abort จำนวน version ที่​ค้าง​อยู่ จำนวน​หน้าที่​เขียน​ลง disk เป็น​กฎ​เดียว​กับ​ที่​คอร์ส query engine ประกาศ​ไว้​ใน​เสา​นี้

รายการ​นี้​เป็น​เส้น​ขอบเขต ไม่ใช่​ข้อ​แก้ตัว — ทุก​ข้อ​จงใจ​ตัด​ออก​เพื่อ​ให้​ส่วน​ที่​เหลือ​รัน​ได้​จริง​ใน 8 บท

  • ไม่มี distributed transaction ไม่มี two-phase commit ไม่มี consensus ทั้งหมด​นี้​เกิด​บน เครื่อง​เดียว process เดียว
  • ไม่มี SQL parser คอร์ส​นี้​เรียก API ของ​เอน​จินตรงๆ เพราะ​เรื่อง​ที่​จะ​เล่า​อยู่​ใต้ SQL ลงไป
  • ไม่มี​การ​กู้​คืน​แบบ​เต็ม​รูป เรา​แตะ write-ahead log เท่า​ที่​บท​ที่ 7 ต้อง​ใช้​เพื่อ​อธิบาย​ราคา ของ transaction ไม่​ได้​สร้าง​ระบบ recovery ครบ​ชุด
  • ไม่​อ้าง​ความเร็ว​เป็น​วินาที​เลย​สัก​จุด ไม่มี​ตัวเลข benchmark เพราะ​วินาที​วัด​เครื่อง​ที่​รัน ไม่​ได้​วัด​สิ่ง​ที่​คอร์ส​นี้​อธิบาย

ทำไม​เสา​นี้​มี​คอร์ส Python อยู่​แล้ว แต่​คอร์ส​นี้​เป็น Rust

หัวข้อ​ที่​มีชื่อ​ว่า “ทำไม​เสา​นี้​มี​คอร์ส Python อยู่​แล้ว แต่​คอร์ส​นี้​เป็น Rust”

หัวข้อ​นี้​ตอบ​คำถาม​ที่​ผู้​อ่าน​จะ​สงสัย​ทันที​ที่​เห็น​ว่า​เสา​เดียวกัน​ใช้​คนละ​ภาษา

คอร์ส​แรก​ของ​เสา​นี้​สร้าง query engine ด้วย Python เพราะ​เรื่อง​ที่​มัน​เล่า​คือ​การ​ตัดสิน​ใจ​ของ planner ซึ่ง​อ่าน​ง่าย​ที่สุด​เมื่อ code สั้น

คอร์ส​นี้​เล่า​เรื่อง​ที่​ต่าง​ออก​ไป มัน​เล่า​ว่า​ใคร​เห็น​ค่า​อะไร​และ​เมื่อไร ซึ่ง​เป็น​เรื่อง​ของ​การ​เป็น​เจ้าของ ข้อมูล​โดยตรง Rust จึง​บังคับ​ให้​เขียน​สิ่ง​ที่​ปกติ​ซ่อน​อยู่​ออก​มา​ให้​เห็น

สอง​คอร์ส​นี้​ไม่​ได้​ใช้ code ร่วม​กัน เริ่ม​คอร์ส​นี้​จาก file เปล่า​ได้​ทันที และ​ไม่​ต้อง​ย้อน​กลับ​ไป อ่าน​คอร์ส​แรก​ก่อน

หัวข้อ​นี้​บอก​ล่วงหน้า​ว่า​ทำไม​บาง​ตัวเลข​ใน​คอร์สมา​จาก script คนละ​ภาษา​กับ​เอนจิน

crate ของ​คอร์ส​นี้​เป็น standard library ล้วน ห้าม​มี external crate สัก​ตัว ซึ่ง​แปล​ว่า​มัน​คุย​กับ SQLite ไม่​ได้

ตัวเลข​ฝั่ง SQLite จึง​มา​จาก script Python ที่ commit ไว้​ใน​รี​โป​นี้​เหมือน​กัน มัน​วัด SQLite ไม่​ได้​วัด​เอนจินของ​เรา ภาษา​ของ​เครื่องมือ​วัด​จึง​ไม่ใช่​ข้อ​อ้าง​ของ​คอร์ส และ​คุณ​รัน​มัน​เอง​ได้

หัวข้อ​นี้​อธิบาย​ว่า​ทำไม​ผู้​อ่าน​ตรวจสอบ code และ​ตัวเลข​ใน​คอร์ส​นี้​เอง​ได้​ทั้งหมด

code ทุก​บล็อก​ใน​บทเรียน​ไม่​ได้​ถูก​พิมพ์​ขึ้น​มา​ใหม่ มัน​ถูก​คัด​มา​จาก file จริง​ใน scripts/transaction-engine/ ที่ commit ไว้​ใน​รี​โป​นี้ และ​มี​เทสต์เทียบ​ที​ละ byte

เอนจิน​นี้​ไม่มี thread และ​ไม่มี​การ​หน่วง​เวลา​เลย​สัก​จุด มัน​สลับ​คิว​ของ transaction เอง ผล​จึง​ออก​มา​เหมือน​เดิม​ทุก​ครั้ง​ที่​รัน ไม่ใช่​ผล​ที่​เปลี่ยน​ไป​ตาม​ความเร็ว​เครื่อง

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

แผนผัง​นี้​จะ​เติม​ขึ้น​เอง​เมื่อ​บทเรียน​ถูก​เพิ่ม​เข้า​มา