Transaksi
Lakukan commit dan rollback
Transaksi adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Alasan Menggunakan Transaksi
Transaksi mengelompokkan beberapa pernyataan sehingga semuanya berhasil atau semuanya gagal secara bersamaan. Hal ini menjaga konsistensi data, misalnya saat memindahkan uang antara dua rekening tanpa kehilangan dana di tengah jalan.
- Atomik: semuanya atau tidak sama sekali
- Keadaan konsisten
- Terisolasi dari transaksi lain
db.Begin
Begin memulai transaksi dan mengembalikan *sql.Tx. Anda menjalankan pernyataan pada Tx, bukan pada kumpulan koneksi, sehingga semuanya menggunakan satu koneksi dan satu transaksi.
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}Pernyataan pada Tx
Panggil tx.Exec dan tx.Query seperti saat menggunakannya pada db, tetapi semuanya berjalan di dalam transaksi sampai Anda melakukan Commit atau Rollback.
_, err = tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1)Commit
tx.Commit() membuat setiap perubahan menjadi permanen dan terlihat oleh pihak lain. Jika mengembalikan kesalahan, transaksi tidak diterapkan.
if err := tx.Commit(); err != nil {
log.Fatal(err)
}Rollback
Jika langkah apa pun gagal, panggil tx.Rollback() untuk membuang semua perubahan sejak Begin. Basis data kembali ke keadaan sebelumnya seolah-olah tidak terjadi apa-apa.
if err != nil {
tx.Rollback()
return err
}Pola defer Rollback
Idiom yang kuat menunda Rollback tepat setelah Begin. Rollback setelah Commit berhasil tidak melakukan apa pun, sehingga pola ini menjamin pembersihan pada jalur kesalahan apa pun.
tx, err := db.Begin()
if err != nil { return err }
defer tx.Rollback()
// ... do work ...
return tx.Commit()Contoh Transfer Atomik
Dua pembaruan membentuk satu operasi logis: mengurangi saldo dari satu rekening dan menambahkannya ke rekening lain. Keduanya harus di-Commit bersama atau tidak satu pun boleh diterapkan.
Simulasi Transaksi yang Dapat Dijalankan
Transaksi nyata memerlukan basis data. Contoh yang dapat dijalankan ini menyimulasikan pemulaian, dua pembaruan, serta Commit atau Rollback menggunakan peta dalam memori.
package main
import (
"errors"
"fmt"
)
func transfer(bal map[string]int, from, to string, amt int) error {
if bal[from] < amt {
return errors.New("insufficient funds")
}
snapshot := map[string]int{from: bal[from], to: bal[to]}
bal[from] -= amt
bal[to] += amt
if bal[from] < 0 {
bal[from], bal[to] = snapshot[from], snapshot[to]
return errors.New("rolled back")
}
return nil
}
func main() {
bal := map[string]int{"alice": 100, "bob": 20}
if err := transfer(bal, "alice", "bob", 30); err != nil {
fmt.Println("error:", err)
} else {
fmt.Println("committed:", bal)
}
}Tingkat Isolasi
db.BeginTx menerima opsi termasuk tingkat isolasi, seperti sql.LevelSerializable. Isolasi yang lebih tinggi mencegah lebih banyak anomali, tetapi dapat mengurangi konkurensi.
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})Jaga Transaksi Tetap Singkat
Transaksi menahan koneksi dan mungkin juga menahan kunci. Jalankan semua perintah SQL dengan cepat, hindari pemanggilan jaringan atau masukan pengguna di dalamnya, dan lakukan Commit segera untuk mengurangi persaingan akses.
Jangan Pernah Mencampur db dan tx
Di dalam transaksi, jalankan pernyataan hanya pada tx. Memanggil db.Exec di sana menggunakan koneksi berbeda di luar transaksi, sehingga perubahan tersebut bukan bagian dari transaksi dan tidak akan dibatalkan oleh Rollback.
Pemeriksaan Singkat
Uji pengetahuan Anda tentang transaksi.
Ringkasan
Anda telah mempelajari transaksi:
- Begin mengembalikan *sql.Tx; jalankan pernyataan di dalamnya
- Commit menyimpan perubahan secara permanen; Rollback membuang semua perubahan
- defer tx.Rollback() menjamin pembersihan saat terjadi kesalahan
- BeginTx mengatur isolasi; jaga transaksi tetap singkat
- Jangan pernah mencampur db dan tx dalam satu transaksi
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Transaksi” gratis?
Ya — teks lengkap “Transaksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Transaksi”?
Lakukan commit dan rollback Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Transaksi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.