Sqlite3错误:数据库在golang中被锁定

Sqlite3错误:数据库在golang中被锁定,go,sqlite,Go,Sqlite,我在golang使用sqlite3数据库,我得到错误:“数据库已锁定。” 我知道不能有多个线程使用同一个数据库文件 虽然我的程序中只有一个连接,但我关闭了所有查询结果,但它总是创建2或3个数据库文件句柄 我可以使用Opendfileview程序来检查这一点 下面的代码创建两个数据库文件句柄 func main() { database, tx, err := getDatabaseHandle() if err != nil { log.Fatal(err)

我在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
}

尝试延迟
行。关闭()


您必须提供更多信息,尤其是演示问题的代码。您确定吗?在我的程序运行之前没有数据库文件句柄,但在我的程序运行之后有2个句柄。因此,我认为只有我的程序本身锁定了数据库文件。您可以在
getDatabaseHandle
中开始事务,但我在任何地方都看不到
tx.Commit
tx.Rollback
。这可能是问题所在吗?你说到点子上了。我通过关闭代码中的所有“行”解决了问题。虽然你的答案并不能完全解决我的问题,但我会检查你的答案。谢谢你的回答,太好了!非常感谢你!我甚至不知道应该关闭数据库处理程序之外的行;我以为这是“自动的”,但显然不是。同样的问题也发生在陈述上;我正在使用一个func来关闭语句,在它们被使用之后。一旦我这么做了,可怕的“数据库被锁定”错误消失了,这让我头痛了好几天!
if err != nil {
    return err
}
defer rows.Close()
if rows.Next() {
    ...
}