站内搜索

SQLite journal 文件_MySQL

生成原因

任何一次的数据库修改操作都会产生journal文件,但是如果按照正常的流程执行完,该文件就会自动删除,几乎是一瞬间,所以我们看不到,如果我们看到该文件,而程序已经执行完了,说明事务回滚了!!

出现journal文件原因有如下的情况:

1)

begin transaction;

commit transaction;

没有配对,导致-journal文件生成

执行了 begintransaction;

没有执行 committransaction;

2)

在使用sqlite3_prepare(db,sql, strlen(sql), &stmt, &tail);后,

必须使用sqlite3_finalize(stmt);将stmt释放。

对于sqlite中的其他各种匹配用法要对应。

解决方案:

1)

你产生.db-journal 是因为是因为你的事务回滚了.(原因可能很多 )

一般在下一个数据查询操作时候就可以恢复.

你可以在你的数据库操作使用timeout这样预见忙 他会等timeout时间.

.db-journal文件产生的可以能性才小

journal暂存档

答案是用来Rollback ,换句话说,就是当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有journal档案的存在,便会对数据库做Rollback 动作(还原)(详细内容:http://www.sqlite.org/atomiccommit.html)。但是有时候系统(主机)电力不稳或突然断电会导致journal档案损毁,因而造成SQLite数据库无法开启[问题1]。必须(手动)删除journal档案,SQLite数据库才能再度开启。

目前所知的方法有两种:

第一种方法:

在系统开机后第一次开启或每一次使用SQLite数据库时,先检查是否已经存在journal档案了,如果是则透过程序自动去删除该journal档案。

但是这有个问题,因为自动删除该journal档案,导致没有Rollback (还原)作用,无法保障数据完整与一致性。缺点二:有时候会发生程序无法自动删除(如:journal档案严重损毁),而导致上面的问题(无法开启数据库)[问题1]再度发生。

第二种方法:

使用"PRAGMAjournal_mode = OFF"指令,这个指令能关闭自动产生journal暂存档动作。

但是如此一来当在写入数据库的过程,一旦发生意外状况,将会导致SQLite数据库无法保障数据完整与一致性。缺点二:journal_mode设定为OFF时,无法使用交易模式(Transaction)进行操作。

第二种方法的缺点二在如果需要使用交易模式(Transaction)进行操作时,可以透过"PRAGMA journal_mode = DELETE"指令,修改回原本的journal模式(journal_mode),就可以使用交易模式(Transaction)。

  • 上一篇:用SQL语句操作数据库_MySQL
  • 下一篇:DDL、DML和DCL的比较【引用学习】_MySQL