2009-08-24 95 views
1

我有一个sqlite数据库,并且我希望在数据库文件没有任何写操作的情况下保持它为只读。带有临时更改的只读sqlite数据库

有没有办法对数据库进行临时修改,而不会永久刷新到磁盘?

现在,我正在通过将临时数据存储在具有与主数据库文件相同架构结构的内存数据库中的方法来解决此问题。这种方法的问题在于它增加了代码的复杂性,因为我必须在两个数据库上运行所有查询。

理想情况下,问题的解决方案会将附加的临时数据视为它是主数据库的一部分,但不实际将其提交到磁盘。

回答

2

因为SQLite is transactional它应该足以不到COMMIT事务(SQLite将在连接关闭时自动回滚它)。您应首先使用BEGIN声明将自动提交设置为关闭。

1
BEGIN IMMEDIATE TRANSACTION; 
do a bunch of stuff; 
ROLLBACK TRANSACTION; 

如果另一个线程从数据库中读取,则ROLLBACK将失败,SQLITE_BUSY,但悬而未决的读取完成后,就可以再次执行它。如果另一个线程想写入数据库,那么他们会打你的锁。

现在,以这种方式使用事务有点有趣,如何在您和数据库之间使用编程式ORM样式的层直接与本地对象一起工作并保持内存中的临时更改?

我的意思是,如果你不想更改数据库,也许你需要另一个代码层,而不是数据库功能?