go-sqlite3 “database is locked”问题解决方案

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

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”,测试报死锁错误,排除。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值