SQLite3-Datenbanksperre in Go
Beim Arbeiten mit SQLite3-Datenbanken in Go können Entwickler auf den Fehler „Datenbank ist gesperrt“ stoßen. Dies tritt normalerweise auf, wenn mehrere Threads gleichzeitig versuchen, auf dieselbe Datenbankdatei zuzugreifen. Selbst wenn jedoch nur eine Verbindung im Code hergestellt wird, können dennoch zusätzliche Datenbankdateihandles erstellt werden.
Im bereitgestellten Codebeispiel wird das Datenbankhandle zweimal erstellt. Zuerst in der Funktion getDatabaseHandle und dann noch einmal in der Funktion dosomething. Dies kann dazu führen, dass mehrere Datenbankdateihandles gleichzeitig geöffnet sind, was zum Fehler „Datenbank ist gesperrt“ führt.
Um dieses Problem zu beheben, verzögern Sie das Schließen der Abfrageergebnisse mithilfe von „defer“. Ändern Sie im Codebeispiel die Funktion „dosomething“ wie folgt:
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() // Defer closing the query results if rows.Next() { ... } // some insert queries tx.Commit() }
Durch die Verzögerung des Schließens der Abfrageergebnisse schließt Go diese automatisch, sobald die Funktion beendet wird, und stellt so sicher, dass die Datenbankdateihandles ordnungsgemäß freigegeben werden.
Das obige ist der detaillierte Inhalt vonWie vermeide ich SQLite3-Datenbanksperren in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!