DB中的SQLite VACUUM从多个进程打开

时间:2017-09-13 19:50:31

标签: sqlite

我有两个关于SQLite VACUUM(可能还有WAL)的问题:

•如果多个进程打开了数据库,那么是否需要最终确定所有进程中的所有SQL语句才能使VACUUM成功?

•为什么VACUUM有时会没有效果(没有回收空格)但是Sqlite会返回SQLITE3_OK?

关于我的问题的更多细节:

我在WAL模式下的数据库由2个进程访问。在某些时候,用户可以选择从数据库中删除数据。因为数据库可以由多个进程打开,所以我删除了记录,然后运行VACUUM来回收磁盘空间(而不是关闭连接并删除文件)。

问题是如果2个进程打开了DB连接,其中一个进程的VACUUM返回OK,但不会真正回收空间。

我认为发生的事情是VACUUM不会成功,直到来自任何进程的任何未完成的SQL语句。问题是我不想让这两个过程相互了解。

我正在考虑从两个进程执行VACUUM,以便最后关闭连接(根据用户请求删除数据),负责空间回收。我也在考虑auto_vacuum(我知道它的局限性,但DELETE在这个数据库上并不常见。

1 个答案:

答案 0 :(得分:0)

documentation说:

  

如果存在打开的事务,或者在运行时有一个或多个活动的SQL语句,则VACUUM将失败。

与任何其他类型的数据库修改一样,可写事务要求没有其他读或写事务处于活动状态;这通常要求重置或最终确定所有陈述。

在WAL模式下,写入事务不会被其他读取事务阻止,但这需要保留旧数据。除真空外,你应该initiate a truncate checkpoint

处理此问题的最简单方法是根本不运行VACUUM;自由空间将在以后重复使用。