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

ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล

รูปแบบ BEGIN/COMMIT และการย้ายโครงสร้าง

ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ธุรกรรมใน database/sql

ครอบการดำเนินการด้วยธุรกรรมโดยใช้ db.BeginTx จากนั้น Commit หรือ rollback เมื่อสิ้นสุด และเลื่อนการ rollback ไว้เสมอเพื่อจัดการแพนิก

tx, err := db.BeginTx(ctx, nil)
if err != nil { return err }
defer tx.Rollback() // no-op after Commit

_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance-100 WHERE id=$1", from)
if err != nil { return err }
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance+100 WHERE id=$1", to)
if err != nil { return err }
return tx.Commit()

ระดับการแยกธุรกรรม

ส่ง sql.TxOptions เพื่อควบคุมระดับการแยกธุรกรรม:

tx, err := db.BeginTx(ctx, &sql.TxOptions{
    Isolation: sql.LevelSerializable,
    ReadOnly:  false,
})

การใช้ Tx เดียวกันข้ามฟังก์ชัน

ส่ง *sql.Tx ไปยังฟังก์ชันตัวช่วย เพื่อให้ทุกฟังก์ชันเข้าร่วมธุรกรรมเดียวกัน ห้ามเรียก db.ExecContext ภายในธุรกรรม ให้ใช้ tx.ExecContext

รูปแบบการเลื่อนเรียก Rollback

เลื่อนการเรียก Rollback ทันทีหลัง BeginTx หากการยืนยันธุรกรรมสำเร็จ การ Rollback ที่ตามมาจะไม่มีผลใด ๆ แต่หากการยืนยันธุรกรรมล้มเหลว Rollback จะย้อนการเปลี่ยนแปลงกลับ

tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful Commit

จุดบันทึก

ใช้จุดบันทึกภายในธุรกรรมเพื่อย้อนกลับบางส่วน (เฉพาะ PostgreSQL ผ่าน SQL โดยตรง):

tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollback

ภาพรวมการย้ายโครงสร้างฐานข้อมูล

การย้ายโครงสร้างฐานข้อมูลคือสคริปต์ SQL ที่มีการกำหนดเวอร์ชันสำหรับปรับเปลี่ยนสคีมาอย่างต่อเนื่อง แต่ละรายการมีทิศทางสำหรับนำไปใช้และย้อนกลับ

golang-migrate

github.com/golang-migrate/migrate/v4 เรียกใช้ไฟล์การย้ายโครงสร้างฐานข้อมูล SQL ที่มีเวอร์ชันตามลำดับ และติดตามเวอร์ชันที่นำไปใช้แล้วในตาราง schema_migrations

m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrations

goose

github.com/pressly/goose/v3 เป็นไลบรารีการย้ายโครงสร้างฐานข้อมูลยอดนิยมอีกตัวหนึ่ง ซึ่งรองรับการย้ายผ่าน SQL และฟังก์ชัน Go พร้อมคำสั่งสำหรับนำไปใช้และย้อนกลับ

goose.Up(db, "migrations")

Atlas สำหรับจัดการสคีมา

Atlas ให้การจัดการสคีมาแบบประกาศ: กำหนดสถานะสคีมาที่ต้องการ แล้ว Atlas จะคำนวณส่วนต่างและสร้างสคริปต์การย้ายโครงสร้างฐานข้อมูลโดยอัตโนมัติ

เรียกใช้การย้ายโครงสร้างฐานข้อมูลเมื่อเริ่มต้น

เรียกใช้การย้ายโครงสร้างฐานข้อมูลผ่านโปรแกรมใน main ก่อนเริ่มเซิร์ฟเวอร์ เพื่อให้แน่ใจว่าสคีมาเป็นปัจจุบันเมื่อปรับใช้ระบบ

if err := runMigrations(db); err != nil { log.Fatal(err) }

แนวปฏิบัติที่ดีสำหรับการย้ายโครงสร้างฐานข้อมูล

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

ตรวจสอบอย่างรวดเร็ว

เหตุใดจึงควรเลื่อนการเรียก tx.Rollback() ทันทีหลัง BeginTx

ทบทวน: ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล

ประเด็นสำคัญ:

  • BeginTx → เลื่อนการเรียก Rollback → ดำเนินงาน → ยืนยันธุรกรรม
  • ส่ง *sql.Tx ให้ฟังก์ชันช่วยเหลือ และใช้ tx.ExecContext แทน db.ExecContext
  • ใช้ golang-migrate หรือ goose สำหรับการย้าย SQL ที่มีเวอร์ชัน
  • เรียกใช้การย้ายโครงสร้างฐานข้อมูลเมื่อเริ่มต้น และให้แต่ละรายการเป็นการเพิ่มสิ่งใหม่

คำถามที่พบบ่อย

บทเรียน “ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล”

รูปแบบ BEGIN/COMMIT และการย้ายโครงสร้าง คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. database/sql และไดรเวอร์
  2. sqlx: การสแกนสตรักต์และคิวรีแบบตั้งชื่อ
  3. pgx: ไดรเวอร์ PostgreSQL ประสิทธิภาพสูง
  4. ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล
← กลับไปที่ Go Academy