Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menentukan Status Transaksi pangkalan data/sql Dengan Selamat Tanpa Ralat?

Bagaimanakah Saya Boleh Menentukan Status Transaksi pangkalan data/sql Dengan Selamat Tanpa Ralat?

Barbara Streisand
Lepaskan: 2024-12-12 22:47:18
asal
394 orang telah melayarinya

How Can I Safely Determine the Status of a database/sql Transaction Without Errors?

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

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

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!

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