Apabila berinteraksi dengan pangkalan data menggunakan perkhidmatan Go for web, adalah penting untuk mengurus transaksi dengan berkesan. Menangguhkan panggilan Balik urus niaga memainkan peranan penting dalam memudahkan kod dan memastikan integriti data.
Pertimbangkan coretan kod berikut daripada dokumentasi pangkalan data Go/sql:
tx, err := db.Begin() if err != nil { log.Fatal(err) } defer tx.Rollback() stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)") if err != nil { log.Fatal(err) } defer stmt.Close() for i := 0; i < 10; i++ { _, err = stmt.Exec(i) if err != nil { log.Fatal(err) } } err = tx.Commit() if err != nil { log.Fatal(err) }
Penyata penangguhan yang dilampirkan kepada panggilan tx.Rollback() menjamin bahawa urus niaga akan ditarik balik jika sebarang ralat berlaku sebelum tx.Commit() panggilan. Walau bagaimanapun, ia menimbulkan persoalan: mengapa tidak hanya mengendalikan ralat selepas tx.Commit() dan secara eksplisit memanggil tx.Rollback()?
err := tx.Commit() if err != nil { log.Error(err) tx.Rollback() }
Pendekatan ini kelihatan logik, tetapi ia mengabaikan aspek kritikal penangguhan .
Kata kunci tangguh dalam Go memastikan bahawa panggilan fungsi akan dilaksanakan pada penghujung fungsi, walaupun ralat berlaku atau fungsi keluar awal melalui penyataan pulangan. Tingkah laku ini amat berharga dalam konteks transaksi pangkalan data.
Dengan menangguhkan panggilan tx.Rollback(), anda boleh memudahkan logik pengendalian ralat. Jika sebarang ralat berlaku sebelum tx.Commit() dipanggil, penyata tangguh memastikan bahawa transaksi akan ditarik balik, tanpa mengira lokasi ralat.
Sebaliknya, jika anda mengendalikan ralat selepas tx .Commit(), anda perlu memanggil tx.Rollback() secara manual sekiranya berlaku ralat. Pendekatan ini menambah satu lagi lapisan kerumitan dan meningkatkan risiko kehilangan panggilan balik secara tidak sengaja.
Satu lagi perkara penting yang perlu dipertimbangkan ialah memanggil tx.Rollback() pada komitmen transaksi tidak mempunyai kesan. Setelah transaksi dilakukan, ia tidak boleh ditarik balik.
Tingkah laku ini memastikan bahawa walaupun menangguhkan tx.Rollback() dipanggil selepas tx.Commit(), transaksi tidak akan ditarik balik. Ini bermakna anda boleh menangguhkan panggilan balik tanpa rasa takut untuk membalikkan urus niaga yang berjaya secara tidak sengaja.
Menunda urus niaga Panggilan balik dalam Go menawarkan beberapa faedah, termasuk pengendalian ralat yang dipermudahkan, pengembalian masuk yang dijamin kes kesilapan, dan perlindungan terhadap pemulangan semula transaksi yang dilakukan secara tidak sengaja. Ia merupakan teknik yang hebat yang menggalakkan kod yang bersih dan boleh dipercayai.
Atas ialah kandungan terperinci Mengapa Anda Perlu Menangguhkan Rollback dalam Transaksi Pangkalan Data Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!