Rumah >pembangunan bahagian belakang >Golang >Mengapa Kod Sqlite3 Golang Saya Mendapat Ralat 'Pangkalan Data Dikunci', dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Kod Sqlite3 Golang Saya Mendapat Ralat 'Pangkalan Data Dikunci', dan Bagaimana Saya Boleh Membetulkannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-11 15:19:19776semak imbas

Why Does My Golang Sqlite3 Code Get a

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!

Kenyataan:
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