ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล
รูปแบบ 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 migrationsgoose
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- database/sql และไดรเวอร์
- sqlx: การสแกนสตรักต์และคิวรีแบบตั้งชื่อ
- pgx: ไดรเวอร์ PostgreSQL ประสิทธิภาพสูง
- ธุรกรรมและการย้ายโครงสร้างฐานข้อมูล