1 背景
rds创建集群后进行启动或者停止操作时,会造成sqlite的写入产生死锁,无法进行后续的写入。
2 问题
sqlite3数据库在写入操作时,如果多路同时写入可能会造成“database is locked”的死锁问题。
3 测试
进行单元测试,在测试文件创建一个db服务,起1000个goroutine向nerv.db中不停地写入数据,在写入数据的同时对数据库中进行查询操作,会出现2种情况:
数据库报“Error: database is locked”,程序无影响继续写入数据;
数据库查询成功,程序报:
time=“2019-09-09T11:18:02+08:00” level=error msg=“failed to save app. path=iy903,err:database is locked” file=“repository/app_repository.go:26”
Register error. failed to save. err:database is locked
4 解决方案
4.1 添加读写锁
在进行sqlite的写操作的函数中加入读写锁,进行测试。
4.2 添加到DSN: cache=shared
在config.json文件db/url中更改为
“…/data/nerv.db?cache=shared”,测试报死锁错误,排除。
4.3 设置db.SetMaxOpenConns(1)
发现底层已经做了这种操作,排除。

本文介绍了在Go语言中使用sqlite3数据库时遇到的'database is locked'死锁问题。当多路并发写入时,会触发此错误。文章通过详细的测试过程,探讨了多种解决方案,包括添加读写锁、调整DSN参数、设置最大连接数、关闭数据库连接、切换journal_mode到WAL模式以及设置_busy_timeout超时时间。最终,设置_busy_timeout参数在测试中显示有效。
最低0.47元/天 解锁文章
2914

被折叠的 条评论
为什么被折叠?



