为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨魅力 2021-11-08 14:30:36
我在 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}
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

尝试推迟rows.Close():


if err != nil {

    return err

}

defer rows.Close()

if rows.Next() {

    ...

}


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信