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

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

}


杨魅力
浏览 182回答 1
1回答

慕斯王

尝试推迟rows.Close():if err != nil {    return err}defer rows.Close()if rows.Next() {    ...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go