rds创建集群后进行启动或者停止操作时,会造成sqlite的写入产生死锁,无法进行后续的写入。
sqlite3数据库在写入操作时,如果多路同时写入可能会造成“database is locked”的死锁问题。
进行单元测试,在测试文件创建一个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
在进行sqlite的写操作的函数中加入读写锁,进行测试。
在config.json文件db/url中更改为
“…/data/nerv.db?cache=shared”,测试报死锁错误,排除。
发现底层已经做了这种操作,排除。
添加defer db.close(),发现公共库已经在container中已经作了相关处理,排除。
执行 db.Exec(“PRAGMA journal_mode=WAL;”)
或者是在sql.Open()中加入例如为:"file:mydbfile.db?cache=shared&mode=rwc&_journal_mode=WAL"的参数
执行后会出现一个问题,原来的数据库文件变为3个文件,nerv.db内的数据丢失。
执行,到一定程度后,程序停在一个状态无法再次执行。查看数据发现,没有数据的写入。排除。
在sql.Open()后添加&_busy_timeout=9999999 的参数。测试暂无报错情况出现。