SQLite:pragma语句是否会被回滚事务撤销?

5
只是想知道像foreign_keys = OFF和VACUUM这样的编译指示符是否会在包含在事务中并回滚的情况下被撤消。
在线文档似乎没有涵盖这个问题...
3个回答

9
不同的Pragma语句有所不同。
例如,SQLite版本3.7.15.2在事务中包括' user_version 'pragma,并将提交和回滚该值。
但是,同一版本的SQLite明确排除(在文档和测试中)外键从事务中排除。
从我的有限采样中看来,没有在事务期间记录为无效的pragma(如foreign_key)将参与事务(如user_version)。
PS:我意识到这是一个非常古老的问题,但当我需要这些信息时,谷歌就把我带到了这里。

出于好奇,你是从哪里找到这个参考的?还是只是在某个版本的sqlite命令行界面中尝试了一下? - stuckj
1
结合此文档 https://www.sqlite.org/pragma.html 和测试。该文档列出了许多 pragma-transaction 交互,但并非全部列出。 - Cory Trese

1

文档没有涵盖事务内发出的pragma语句通常会发生什么,但它确实涵盖了foreign_keys(以及可能是其他)的主题:

在事务中,此pragma不起作用;只有在没有挂起的BEGIN或SAVEPOINT时才能启用或禁用外键约束执行。

VACUUM不是一个pragma,而且文档确实涵盖了事务:

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


0

我可以验证的是,在事务中至少以下PRAGMA是无效的:

PRAGMA journal_mode=WAL;

如果尝试这样做,您将收到以下某种错误消息的提示:

SQL逻辑错误:无法在事务内部从非wal模式切换到wal模式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接