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