热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

因未捕获的异常导致崩溃后SQLite日志文件行为

我正在一个涉及SQLite的项目中,我只有一个数据库文件,现在我正在测试我的应

我正在一个涉及SQLite的项目中,我只有一个数据库文件,现在我正在测试我的应用程序在断电或应用程序崩溃的情况下的行为。
我已成功测试了电源中断情况下日志文件的回滚,但是我正在为应用程序崩溃(例如由于未捕获的异常)而导致的SQLite行为苦苦挣扎。

让我们假设这种情况(真实数据库上的操作比单个插入要复杂得多,这就是为什么我要显式使用事务的原因):

sqlite3_exec(db,"BEGIN;",nullptr,nullptr);
/* other code (may be select,delete,update on the db or something not related to the db) */
sqlite3_exec(db,"INSERT INTO mytable(myvalue) VALUES(10);",nullptr);
throw "exception"; /* something throws an exception here */
sqlite3_exec(db,"COMMIT;",nullptr);

上面的代码结果是我在磁盘上还有一个日记文件。我的期望是,崩溃后我一开始与数据库建立连接,就会自动读取日志文件并执行回滚。

我实际上注意到的是,直到我开始另一笔交易之前,日志文件才被触摸,然后独立于此新交易(提交或回滚)的结果,我在上述代码中抛出之前所做的更改将自动回滚。这是预期的行为吗?也许是因为日志文件不是热门新闻文件,因为在回滚或提交期间没有发生崩溃?

编辑:可能我找到了这种现象的原因。默认情况下,SQLite中的自动提交模式是启用的,并且仅在手动启动事务时才禁用,然后在手动事务完成(提交或回滚)后再次启用。如果在事务开始之后但事务结束之前发生崩溃或断电,则将禁用自动提交,并且当再次打开数据库时,自动提交仍将被禁用,因此除非处理了日志,否则将不会处理日志文件新事务已启动和完成(通过回滚或提交)。如果在执行提交或回滚时发生崩溃或断电,则不会发生这种情况,因为在那一刻,再次启用了自动提交功能,因此新的时间SQLite将自动进行回滚。





推荐阅读
  • Python使用SQLite1.sqlite3的安装python2.5.x以上版本默认自带sqlite3模块。2.链接sqlite3数据库```#导入sqlite3模块import ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • MySQL插入数据的四种方式及安全性分析
    本文介绍了MySQL插入数据的四种方式:插入完整的行、插入行的一部分、插入多行和插入查询结果,并对其安全性进行了分析。在插入行时,应注意字段的定义和赋值,以提高安全性。同时指出了使用insert语句的不安全性,应尽量避免使用。建议在表中定义相关字段,并根据定义的字段赋予相应的值,以增加插入操作的安全性。 ... [详细]
  • WhenImtryingtorunthefollowing:当我试图运行以下内容时:ContentValuescvnewContentValues();cv ... [详细]
  • 在Android Studio中查看SQLite数据库
    原来查看数据库内容,我们一般都是将数据库文件从手机导出,再用专门的软件打开查看,比较繁琐。最近发现了一个比较方便的方法:使用工具stetho。使用方式在gradle中配置depen ... [详细]
  • 有没有人用过sqlite?关于tablehasnocolumnnamedcolumn插入数据的时候报上边的错。问题是我明明有这一列。直接在sqlitedevoloper里执 ... [详细]
  • IhaveonedoubtinSqlite.dteTimeDataTypeisVarchar(200)inTablestructure.Iwanttogetresult ... [详细]
  • 州的先生(https:zmister.com)在很多项目中都有使用到SQLite数据库作为数据存储的工具,其中包括一些桌面图形界面程序和线上的Web应用程序。至今为止,它们都运行良 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
author-avatar
烟熏装-_265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有