Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengesan Komit Transaksi Pangkalan Data atau Rollback dengan Amanah dalam Pakej `pangkalan data/sql` Go?

Bagaimanakah Saya Boleh Mengesan Komit Transaksi Pangkalan Data atau Rollback dengan Amanah dalam Pakej `pangkalan data/sql` Go?

Patricia Arquette
Lepaskan: 2024-12-22 18:44:11
asal
650 orang telah melayarinya

How Can I Reliably Detect Database Transaction Commit or Rollback in Go's `database/sql` Package?

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
}
Salin selepas log masuk

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
    })
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan