Heim >Backend-Entwicklung >Golang >Warum erhält mein Golang-SQLite3-Code den Fehler „Datenbank ist gesperrt' und wie kann ich ihn beheben?

Warum erhält mein Golang-SQLite3-Code den Fehler „Datenbank ist gesperrt' und wie kann ich ihn beheben?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-11 15:19:19776Durchsuche

Why Does My Golang Sqlite3 Code Get a

So beheben Sie den Sqlite3-Fehler: Datenbank ist in Golang gesperrt

In Golang kann der Fehler bei der Arbeit mit Sqlite3-Datenbanken auftreten , „Datenbank ist gesperrt.“ Dieser Fehler weist darauf hin, dass mehrere Threads nicht gleichzeitig dieselbe Datenbankdatei verwenden können.

Ursache des Problems

Auch wenn Sie möglicherweise nur eine einzige Verbindung in Ihrem Programm haben und schließen Wenn Sie alle Abfrageergebnisse vergleichen, erhalten Sie möglicherweise immer noch mehrere Handles für die Datenbankdatei. Dieses Problem kann mit dem Opendfileview-Programm überprüft werden.

Code zum Erstellen mehrerer Datenbankdateihandles

Der folgende Code zeigt, wie zwei Datenbankdateihandles erstellt werden:

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
}

Lösung

Um das Problem zu beheben, können Sie das Problem verschieben rows.Close()-Aufruf wie unten gezeigt:

if err != nil {
    return err
}
defer rows.Close() // Move defer here
if rows.Next() {
    ...
}

Durch das Verzögern des rows.Close()-Aufrufs stellen Sie sicher, dass die Zeilen geschlossen werden, auch wenn während der Iteration eine Panik oder ein Fehler auftritt. Dadurch wird verhindert, dass zusätzliche Datenbankdatei-Handles erstellt werden, und der Fehler „Datenbank ist gesperrt“ wird behoben.

Das obige ist der detaillierte Inhalt vonWarum erhält mein Golang-SQLite3-Code den Fehler „Datenbank ist gesperrt' und wie kann ich ihn beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn