如果包含在回滚的事务中,诸如
foreign_keys = OFF
和VACUUM
之类的编译指示会被撤消吗?文档似乎没有涵盖这一点。
不同的pragma语句是不同的。
SQLite 版本 3.7.15.2 在事务中包含 pragma
user_version
,并将 COMMIT 和 ROLLBACK 值。但是,它(在文档和测试中)将foreign_keys
排除在交易之外。看起来在交易期间未记录为无效的编译指示将参与交易。
该文档不涵盖一般情况下在事务内部发出的 pragma 语句会发生什么,但它确实涵盖了 foreign_keys 的主题(可能还有其他主题):
此编译指示是事务中的无操作;外键约束 仅当没有待处理的情况时才可以启用或禁用强制执行 开始或保存点。
VACUUM 不是一个编译指示,文档确实涵盖了事务:
如果有未完成的事务,或者有 运行时一个或多个活动 SQL 语句。
我可以验证至少以下 PRAGMA 在交易中无效:
PRAGMA journal_mode=WAL;
如果尝试,您将收到以下错误消息:
SQL 逻辑错误:无法从事务内更改为 wal 模式