2017-09-13 71 views
0

我已经约SQLite的真空(也可能是WAL)两个问题打开成功?真空的SQLite从多个进程

•为什么VACUUM有时不起作用(没有空间回收),但Sqlite返回SQLITE3_OK?

多一点细节我的问题:

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

问题是,如果两个进程打开了数据库连接,则其中一个进程的VACUUM返回OK,但并不真正回收空间。

我想会发生什么事情,直到有任何未完成的SQL语句来自任何进程,VACUUM才会成功。问题是我不想让这两个进程意识到对方。

我正在考虑的是从两个进程中进行VACUUM,以便最后关闭连接(根据用户请求删除数据)进行空间回收。我也在考虑auto_vacuum(我知道它的局限性,但删除操作并不在此数据库上非常频繁

回答

0

documentation说:如果有一个打开的事务

一个真空会失败,或者如果。有一个或多个活动的SQL语句在运行时

正如任何其他数据库修改的,可写的事务需要,没有其他的读取或写入事务处于活动状态,这通常要求所有语句重置或确定。

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


最简单的处理方法是根本不运行VACUUM;可用空间将在稍后重新使用。

+0

找出为什么没有来自真空调用的SQLite错误仍然很有趣。 –

+0

如果它返回SQLITE_OK,它确实确实做了一个真空。 –

+0

虽然磁盘上的文件大小保持不变,但检查了很多次。 –