int sqlite3_snapshot_open( sqlite3 *db, const char *zSchema, sqlite3_snapshot *pSnapshot );
The sqlite3_snapshot_open(D,S,P) 接口要么启动一个新的读事务,要么升级现有事务,为 数据库连接 D 的模式 S 启动事务,使读事务引用历史 快照 P,而不是数据库的最新更改。The sqlite3_snapshot_open() 接口在成功时返回 SQLITE_OK,如果失败则返回适当的 错误代码。
为了成功,当调用 sqlite3_snapshot_open(D,S,P) 时,数据库连接不能处于 自动提交模式。如果模式 S 上已经有一个读事务打开,则数据库句柄不能有活动语句(已传递到 sqlite3_step() 但未传递到 sqlite3_reset() 或 sqlite3_finalize() 的 SELECT 语句)。如果违反了这些条件之一,或者模式 S 不存在,或者快照对象无效,则返回 SQLITE_ERROR。
如果指定的快照已被 检查点 覆盖,则对 sqlite3_snapshot_open() 的调用将无法打开。在这种情况下,将返回 SQLITE_ERROR_SNAPSHOT。
如果此函数被调用时已经有一个读事务打开,则如果返回 SQLITE_ERROR、SQLITE_BUSY 或 SQLITE_ERROR_SNAPSHOT,则相同的事务将保持打开(在相同的数据库快照上)。如果返回其他错误代码——例如 SQLITE_PROTOCOL 或 SQLITE_IOERR 错误代码——则读事务的最终状态将是未定义的。如果返回 SQLITE_OK,则读事务现在将在数据库快照 P 上打开。
如果数据库连接 D 不知道模式 S 的数据库文件是否处于 WAL 模式,则对 sqlite3_snapshot_open(D,S,P) 的调用将失败。如果该数据库连接之前没有进行过 I/O 操作,或者在该数据库连接上最近一次 I/O 操作之后数据库进入了 WAL 模式,则该数据库连接可能不知道该数据库文件是否处于 WAL 模式。(提示:对新打开的数据库连接运行 "PRAGMA application_id",以使其准备好使用快照。)
只有在使用 SQLITE_ENABLE_SNAPSHOT 编译时选项时,sqlite3_snapshot_open() 接口才可用。