C++ 关于sqlite3处理挂载网络数据库只能查看不能写入的BUG(挂载读写权限与数据库读写权限正常)

问题说明

最近在写个项目,用到了sqlite,在处理挂载到服务器的NAS上的DB数据库时,无论是使用命令行,还是C++程序执行SQL语句,都只能SELECT,不能INSERT,即只能读不能写;写入时返回SQLITE_BUSY(5) / database is lock,而对于处理本地DB数据就一切正常

解决过程

1、刚开始,认为是有事务占用数据库,尝试INSERT插入最简单的数据,结果仍是BUSY

2、又想到时挂载权限或者数据库读写权限的问题,经过一番查找,权限也没问题

3、尝试各种办法...

最终解决方式

将数据库COPY到本地,或者SSH到NAS存储服务器,sqlite3命令行对DB文件执行

PRAGMA journal_mode=WAL;

最终问题得到解决,历时3天...

在网上了解WAL模式(参考文章),发现WAL提供了更多的并发性,读时不会阻塞写,写时不会阻塞读;

WAL工作模式:保留原始的数据库文件,将更新的内容append到一个单独的wal文件中;当有特殊的标记表明事务提交操作的内容append到wal文件时,就会触发提交操作;这样,在没有改动原始数据文件的情况下就发生了提交操作;更新的内容只是提交到了wal文件,所以其他读进程仍然可以继续操作原始的数据库文件;多个事务的更新都是append到同一个wal文件中的。

posted @ 2023-04-17 16:33  HaijianYang  阅读(92)  评论(0编辑  收藏  举报