Cara Membetulkan Ralat Sqlite3: Pangkalan Data Dikunci di Golang
Di Golang, apabila bekerja dengan pangkalan data Sqlite3, anda mungkin menghadapi ralat , "pangkalan data dikunci." Ralat ini menunjukkan bahawa berbilang urutan tidak boleh menggunakan fail pangkalan data yang sama secara serentak.
Akar Masalah
Walaupun anda mungkin hanya mempunyai satu sambungan dalam program anda dan tutup semua hasil pertanyaan, anda mungkin masih mempunyai beberapa pemegang pada fail pangkalan data. Isu ini boleh disahkan menggunakan program Opendfileview.
Kod Mencipta Berbilang Pemegang Fail Pangkalan Data
Kod berikut menunjukkan cara dua pengendalian fail pangkalan data dicipta:
import "log" import ( "database/sql" "fmt" ) func main() { database, tx, err := getDatabaseHandle() if err != nil { log.Fatal(err) } defer database.Close() dosomething(database, tx) } func dosomething(database *sql.DB, tx *sql.Tx) error { rows, err := database.Query("select * from sometable where name=?", "some") if err != nil { return err } defer rows.Close() // Missing defer if rows.Next() { ... } rows.Close() //some insert queries tx.Commit() } func getDatabaseHandle() (*sql.DB, *sql.Tx, error) { database, err := sql.Open("sqlite3", dbPath) if err != nil { fmt.Println("Failed to create the handle") return nil, nil, err } if err2 := database.Ping(); err2 != nil { fmt.Println("Failed to keep connection alive") return nil, nil, err } tx, err := database.Begin() if err != nil { return nil, nil, err } return database, tx, nil }
Penyelesaian
Untuk menyelesaikan isu tersebut, anda boleh menangguhkan baris.Close() panggilan seperti yang ditunjukkan di bawah:
if err != nil { return err } defer rows.Close() // Move defer here if rows.Next() { ... }
Dengan menangguhkan baris.Close() panggilan, anda memastikan baris ditutup walaupun panik atau ralat berlaku semasa lelaran. Ini membantu menghalang pemegang fail pangkalan data tambahan daripada dibuat dan menyelesaikan ralat "pangkalan data dikunci".
Atas ialah kandungan terperinci Mengapa Kod Sqlite3 Golang Saya Mendapat Ralat 'Pangkalan Data Dikunci', dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!