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!