pangkalan data/sql Tx: Mengesan Status Transaksi
Soalan:
Bagaimana anda boleh menentukan sama ada transaksi menggunakan pangkalan data/sql telah dilakukan atau digulung semula tanpa mencetuskan ralat?
Jawapan:
Untuk mengesan status transaksi, patuhi amalan terbaik berikut:
1. Simpan Transaksi dalam Fungsi:
Pastikan Begin(), Commit(), dan Rollback() dipanggil dalam fungsi yang sama. Ini memastikan transaksi dijejaki dengan lancar.
2. Gunakan Tangguh untuk Penutupan Transaksi:
Sertakan fungsi penangguhan untuk melakukan Rollback jika perlu. Ini menjamin pengendalian transaksi yang betul.
3. Pengendali Transaksi untuk Keringkasan:
Laksanakan fungsi pengendali transaksi untuk merangkum transaksi, memastikan keringkasan dan pengendalian yang betul.
Contoh Kod:
import "database/sql" func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) { tx, err := db.Begin() if err != nil { return } defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } else if err != nil { tx.Rollback() } else { err = tx.Commit() } }() err = txFunc(tx) return err }
Menggunakan transaksi pengendali:
func (s Service) DoSomething() error { return Transact(s.db, func(tx *sql.Tx) error { if _, err := tx.Exec(...); err != nil { return err } if _, err := tx.Exec(...); err != nil { return err } return nil }) }
Mengendalikan Panik:
Gunakan recover() untuk menangkap panik dan memastikan Rollback tepat pada masanya. Buang semula panik untuk membenarkan pengendalian jika ia dijangka.
Objek GC dan Tx:
Menetapkan Tx kepada sifar selepas Commit atau Rollback tidak mengosongkan memori secara automatik . Sebaliknya, bergantung pada pemungut sampah untuk mengendalikan perkara ini.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Status Transaksi pangkalan data/sql Dengan Selamat Tanpa Ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!