Maison >base de données >tutoriel mysql >SQLite journal 文件_MySQL

SQLite journal 文件_MySQL

WBOY
WBOYoriginal
2016-05-30 17:09:513456parcourir

生成原因

 

任何一次的数据库修改操作都会产生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)。

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn