Mengesan Transaksi Commit atau Rollback dalam pangkalan data/sql
Dalam pakej pangkalan data/sql dengan antara muka pemacu dan jenis Tx, ia bukan mungkin secara jelas untuk menentukan sama ada transaksi telah dilakukan atau ditarik balik tanpa mencuba transaksi lain. Ralat yang dikembalikan daripada percubaan berikutnya kemudiannya boleh diperiksa untuk membuat kesimpulan status transaksi.
Untuk mengelakkan overhed tambahan, seseorang mungkin mempertimbangkan untuk menetapkan pembolehubah Tx kepada sifar selepas komit atau rollback. Walau bagaimanapun, pendekatan ini secara amnya tidak digalakkan kerana ia boleh menyebabkan kelakuan yang tidak dijangka dan kebocoran memori.
Penyelesaian yang disyorkan ialah menggunakan pengendali transaksi untuk menyelesaikan logik transaksi. Ini memastikan bahawa panggilan Begin(), Commit(), dan Rollback() sentiasa berada dalam fungsi yang sama, memudahkan penjejakan dan memastikan pengendalian transaksi yang betul menggunakan penyata tangguh.
Contohnya:
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) // re-throw panic after Rollback } else if err != nil { tx.Rollback() // err is non-nil; don't change it } else { err = tx.Commit() // err is nil; if Commit returns error update err } }() err = txFunc(tx) return err }
Dengan pengendali ini, logik transaksi boleh dirangkumkan seperti berikut:
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 }) }
Pendekatan ini menyimpan kod transaksi ringkas dan memastikan pengendalian yang konsisten. Ambil perhatian bahawa pengendali transaksi menggunakan recover() untuk memintas panik dan memulakan pengembalian semula dengan segera. Walau bagaimanapun, perlu ditekankan bahawa mengembalikan ralat lebih diutamakan daripada panik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Komit Transaksi Pangkalan Data atau Rollback dengan Amanah dalam Pakej `pangkalan data/sql` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!