ทำไมต้องมี isolation level — สร้าง transaction manager เอง
ก่อนเริ่ม — สิ่งที่ควรมีมาก่อน
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม — สิ่งที่ควรมีมาก่อน”ต้องมี 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 เปล่าได้ทันที และไม่ต้องย้อนกลับไป อ่านคอร์สแรกก่อน
เครื่องมือวัดฝั่ง SQLite เป็น Python และนั่นตั้งใจ
หัวข้อที่มีชื่อว่า “เครื่องมือวัดฝั่ง SQLite เป็น Python และนั่นตั้งใจ”หัวข้อนี้บอกล่วงหน้าว่าทำไมบางตัวเลขในคอร์สมาจาก script คนละภาษากับเอนจิน
crate ของคอร์สนี้เป็น standard library ล้วน ห้ามมี external crate สักตัว ซึ่งแปลว่ามันคุยกับ SQLite ไม่ได้
ตัวเลขฝั่ง SQLite จึงมาจาก script Python ที่ commit ไว้ในรีโปนี้เหมือนกัน มันวัด SQLite ไม่ได้วัดเอนจินของเรา ภาษาของเครื่องมือวัดจึงไม่ใช่ข้ออ้างของคอร์ส และคุณรันมันเองได้
code ทุกบรรทัดมาจาก crate ที่คุณคอมไพล์เองได้
หัวข้อที่มีชื่อว่า “code ทุกบรรทัดมาจาก crate ที่คุณคอมไพล์เองได้”หัวข้อนี้อธิบายว่าทำไมผู้อ่านตรวจสอบ code และตัวเลขในคอร์สนี้เองได้ทั้งหมด
code ทุกบล็อกในบทเรียนไม่ได้ถูกพิมพ์ขึ้นมาใหม่ มันถูกคัดมาจาก file จริงใน
scripts/transaction-engine/ ที่ commit ไว้ในรีโปนี้ และมีเทสต์เทียบทีละ byte
เอนจินนี้ไม่มี thread และไม่มีการหน่วงเวลาเลยสักจุด มันสลับคิวของ transaction เอง ผลจึงออกมาเหมือนเดิมทุกครั้งที่รัน ไม่ใช่ผลที่เปลี่ยนไปตามความเร็วเครื่อง
นั่นคือเหตุผลที่คอร์สนี้กล้าพิมพ์ตัวเลขลงในบทเรียน ถ้าคุณรันแล้วได้ไม่เท่ากัน แปลว่ามีอะไรผิด ไม่ใช่ “แล้วแต่เครื่อง”
เส้นทางการเรียน
หัวข้อที่มีชื่อว่า “เส้นทางการเรียน”แผนผังนี้จะเติมขึ้นเองเมื่อบทเรียนถูกเพิ่มเข้ามา