我在golang中使用sqlite3数据库,但出现错误:“数据库已锁定”。
我知道使用同一数据库文件不能有多个线程。
尽管我的程序中只有一个连接并关闭了所有查询结果,但是它始终会创建2或3个数据库文件的句柄。
我通过使用opendfileview程序对它进行了云检查。
任何人都可以帮助我解决这个问题。提前致谢。
以下代码创建两个数据库文件句柄。
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 } 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 }
尝试延迟rows.Close():
rows.Close()
if err != nil { return err } defer rows.Close() if rows.Next() { ... }