go - 并发 goroutine 尝试访问数据库时避免 SQLite 文件/数据库锁定的预防措施?

标签 go sqlite

我目前正在开发一个应用程序,其中多个 goroutine 可能在某个时候尝试同时查询或更新 SQLite 数据库文件(使用 github.com/mattn/go-sqlite3 和数据库/sql 驱动程序。)

我不确定的是如何控制锁定/并发访问;驱动程序会处理它,还是我需要找到一种方法来使用互斥锁或 channel 序列化请求?

有人知道如果数据库文件由于某种原因被锁定,驱动程序是否会等待执行操作并重试,还是会抛出错误并放弃?

最佳答案

您应该为每个 goroutine 打开一个单独的连接。驱动程序将负责锁定和访问,但每个 goroutine 应该有不同的连接。

此外,您还可以在连接打开时添加一些参数以加快某些访问速度:

gDb, err = sql.Open("sqlite3", "file:databaselocked.sqlite?cache=shared&mode=rwc")

查看 Github 中关于此线程的评论,尤其是包作者的链接评论:https://github.com/mattn/go-sqlite3/issues/148#issuecomment-56764080

关于go - 并发 goroutine 尝试访问数据库时避免 SQLite 文件/数据库锁定的预防措施?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36431452/

相关文章:

go - 使用值创建结构实例

go - 可测试的数据库/sql sql.Rows in go

Golang : reflect. DeepEqual 返回 false

r - 使用 dplyr 获取 SQL 表的列类型

sqlite - 执行 SQLite 脚本

go installing package/usr/bin/go 不是目录

json - 在 Golang 中对 http json 响应进行单元测试

PreparedStatement 中的 Java 资源泄漏

iphone - 如何使 iPhone 应用程序中的 SQLite 数据库可用于桌面?

javascript - 如何检查sqlite3 Nodejs中是否存在表