SQLite:是否通过回滚事务撤消了pragma语句?

时间:2011-09-09 09:39:12

标签: sqlite transactions pragma

只是想知道如果包含在回滚的事务中,是否可以撤消诸如foreign_keys = OFF和VACUUM之类的编译指示。

在线文档似乎没有涵盖这个......

3 个答案:

答案 0 :(得分:6)

不同的pragma语句不同。

例如,SQLite版本3.7.15.2在事务中包含pragma'user_version',并且将COMMIT和ROLLBACK值。

但是,相同版本的SQLite明确地排除了(在文档和测试中)来自事务的foreign_keys。

从我的有限采样中看来,在事务处理期间未记录为无效的编译指示(foreign_key)将参与该事务(如user_version。)

PS:我意识到这是一个非常古老的问题,但是当我需要这些信息时谷歌就把它带到了我的身边。

答案 1 :(得分:1)

该文档未涵盖在一般事务中发布的pragma语句会发生什么,但它确实涵盖了foreign_keys(以及可能对其他人)的主题:

  

此pragma是交易中的无操作;外键约束   只有在没有待处理时才可以启用或禁用强制执行   开始或SAVEPOINT。

VACUUM不是一个编译指示,而documentation确实涵盖了交易:

  

如果存在打开的交易,或者存在交易,则VACUUM将失败   运行时的一个或多个活动SQL语句。

答案 2 :(得分:0)

我可以验证至少以下PRAGMA在交易中无效:

PRAGMA journal_mode=WAL;

如果尝试这样做,您将收到以下错误消息:

SQL逻辑错误:无法从事务内更改为wal模式