锁定sqlite3 db以进行文件下载

时间:2011-10-07 11:00:04

标签: c++ c database sqlite locking

我在某些系统上有一个sqlite3数据库,我需要在正在进行的操作中下载它。停止或暂停访问进程不是一种选择。因此,据我所知,我需要在下载期间将数据库中的SHARED锁(如http://www.sqlite.org/lockingv3.html中所述)保存到数据库,以避免数据库更改和下载过程中的损坏。我如何明确获得这样的锁定?下载是从C ++程序控制的,所以我需要锁定它。

编辑:thkala建议进行数据库转储。但我更愿意找到一个带锁定的解决方案,因为我不确定是否有足够的内存可用于完整的数据库副本。

3 个答案:

答案 0 :(得分:8)

不,不。不,不!

手动锁定和复制文件是处理事情的旧方法。 SQLite现在有一个适当的backup API可以使用。这是执行SQLite数据库的在线副本的推荐方法 - 您可以使用它来创建数据库的副本,然后可以在方便时下载。

编辑:

如果你绝对 使用锁定,你可以使用概述here的方法 - 可能在翻译成C之后:

  • 打开数据库

  • 使用BEGIN IMMEDIATE语句获取共享锁。

  • 手动复制/下载文件 - 确保您不会错过任何文件。至少有DB文件,日志文件和可能的WAL文件。您可能希望将DB放在单独的目录中以简化操作。

  • ROLLBACK您刚刚开始的交易。

我理解这种方法在某些情况下如何有用,但我必须重复一遍,不再是推荐的方法。

答案 1 :(得分:2)

我忽略了解决方案: 使用

开始交易
BEGIN IMMEDIATE TRANSCTION

并以

结束
END TRANSACTION

获取锁定。 IMMEDIATE关键字不是默认值,并且在调用返回时db已被锁定(已获取RESERVED锁定)。

答案 2 :(得分:-3)

这里的解决方案是错误的,留给后人和人们了解为什么这是一个坏主意。

我认为您也可以将数据库与日志一起复制。(将db和journal复制到tmp文件然后下载它们)然后在远程端尝试打开这个数据库,它将修复本身。这是应用程序使用正确的交易。

请阅读以下评论,解释为何错误:

  

它的要点是,你可以复制db&期刊,但只有你   可以在同一时刻完全同时获得。

这或多或少是不可能的。