Android 在断电期间,SQLite将数据库回滚到开始之前的某个点
我的应用程序中有一个SQLite数据库。每次应用程序修改/添加数据库中的行时,应用程序都会通过发出命令Android 在断电期间,SQLite将数据库回滚到开始之前的某个点,android,sqlite,android-ndk,Android,Sqlite,Android Ndk,我的应用程序中有一个SQLite数据库。每次应用程序修改/添加数据库中的行时,应用程序都会通过发出命令BEING transaction显式启动SQLite事务。更新/添加数据库中的数据后,如果更新失败,我会发出命令COMMIT,或者ROLLBACK。常用的东西()。在我断电之前,一切正常 问题是每次我在应用程序执行COMMIT、启动设备并最终启动应用程序后断电时,SQLITE都会保留数据,就好像BEGIN和COMMIT从未发生过一样!为什么? 我还检查了我的应用程序目录中的数据库文件,它有正确
BEING transaction
显式启动SQLite事务。更新/添加数据库中的数据后,如果更新失败,我会发出命令COMMIT
,或者ROLLBACK
。常用的东西()。在我断电之前,一切正常
问题是每次我在应用程序执行COMMIT
、启动设备并最终启动应用程序后断电时,SQLITE都会保留数据,就好像BEGIN
和COMMIT
从未发生过一样!为什么?
我还检查了我的应用程序目录中的数据库文件,它有正确的数据。我还注意到在我的应用程序目录中有一个额外的文件-journal
。经过检查,这是SQLite用来支持回滚不完整事务的方法,尤其是在断电期间
同样,我的
COMMIT
发生在断电之前。我的数据库文件(在我的应用程序目录中选中)包含正确的数据。但是为什么-journal
包含较旧的数据呢?我一点也不明白。我在这里遗漏了什么吗?您的数据库使用的是PRAGMA synchronous
和PRAGMA journal\u mode
的哪些设置?这些可以用来控制sqlite在这些方面的精确行为
包含旧内容的-journal
文件的行为听起来像这里描述的回滚日志:
当一个进程想要更改一个数据库文件(并且它没有处于WAL模式)时,它首先在回滚日志中记录原始的未更改的数据库内容。回滚日志是一个普通磁盘文件,它始终位于与数据库文件相同的目录或文件夹中,并且与数据库文件具有相同的名称,并添加了-journal后缀。[……]
[……]
如果需要回滚日志以恢复其数据库的完整性,则称回滚日志为热日志。当进程处于数据库更新的中间,程序或操作系统崩溃或断电阻止更新完成时,创建热日志。热日志是一种例外情况。存在热日志以从崩溃和电源故障中恢复。如果一切正常(也就是说,如果没有崩溃或电源故障),你将永远不会得到一份热门日志
可设置的不同日记账模式如下所述:
删除日志记录模式是正常行为。在删除模式下,在每个事务结束时删除回滚日志。实际上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为的文档。)
您可以尝试为PRAGMA synchronous
设置其他设置,请参见以下设置:
- 额外(3) “额外同步”与“完全同步”类似,它增加了一个功能,即在取消包含回滚日志的目录的链接以在删除模式下提交事务之后,对该目录进行同步。如果提交之后紧接着断电,EXTRA提供额外的耐久性
- 全部(2) 当synchronous已满(2)时,SQLite数据库引擎将使用VFS的xSync方法,以确保在继续之前将所有内容安全地写入磁盘表面。这可确保操作系统崩溃或电源故障不会损坏数据库。完全同步是非常安全的,但速度也较慢。当不处于WAL模式时,FULL是最常用的同步设置
PRAGMA synchronous=EXTRA代码>可能会执行您想要的操作,但这可能会以性能为代价
您还可以尝试使用PRAGMA journal\u mode=WAL代码>,如中所述,如果在断电时对您更有效,则使用较轻的PRAGMA synchronous设置数据库使用的PRAGMA synchronous
和PRAGMA journal\u模式
有哪些设置?这些可以用来控制sqlite在这些方面的精确行为
包含旧内容的-journal
文件的行为听起来像这里描述的回滚日志:
当一个进程想要更改一个数据库文件(并且它没有处于WAL模式)时,它首先在回滚日志中记录原始的未更改的数据库内容。回滚日志是一个普通磁盘文件,它始终位于与数据库文件相同的目录或文件夹中,并且与数据库文件具有相同的名称,并添加了-journal后缀。[……]
[……]
如果需要回滚日志以恢复其数据库的完整性,则称回滚日志为热日志。当进程处于数据库更新的中间,程序或操作系统崩溃或断电阻止更新完成时,创建热日志。热日志是一种例外情况。存在热日志以从崩溃和电源故障中恢复。如果一切正常(也就是说,如果没有崩溃或电源故障),你将永远不会得到一份热门日志
可设置的不同日记账模式如下所述:
删除日志记录模式是正常行为。在删除模式下,在每个事务结束时删除回滚日志。实际上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为的文档。)
您可以尝试为PRAGMA synchronous
设置其他设置,请参见以下设置:
- 额外(3)
“额外同步”与“完全同步”类似,它增加了一个功能,即在取消包含回滚日志的目录的链接以在删除模式下提交事务之后,对该目录进行同步。