pragma 语句是否会通过回滚事务来撤消?

问题描述 投票:0回答:3

如果包含在回滚的事务中,诸如

foreign_keys = OFF
VACUUM
之类的编译指示会被撤消吗?文档似乎没有涵盖这一点。

sqlite transactions pragma
3个回答
10
投票

不同的pragma语句是不同的。

SQLite 版本 3.7.15.2 在事务中包含 pragma

user_version
,并将 COMMIT 和 ROLLBACK 值。但是,它(在文档和测试中)将
foreign_keys
排除在交易之外。看起来在交易期间未记录为无效的编译指示将参与交易。


1
投票

该文档不涵盖一般情况下在事务内部发出的 pragma 语句会发生什么,但它确实涵盖了 foreign_keys 的主题(可能还有其他主题):

此编译指示是事务中的无操作;外键约束 仅当没有待处理的情况时才可以启用或禁用强制执行 开始或保存点。

VACUUM 不是一个编译指示,文档确实涵盖了事务:

如果有未完成的事务,或者有 运行时一个或多个活动 SQL 语句。


0
投票

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

PRAGMA journal_mode=WAL;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.