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
Lepaskan: 2024-12-11 15:19:19
asal
798 orang telah melayarinya

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

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

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!

sumber:php.cn
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