SQLite:是通过回滚事务来撤消的pragma语句



只是想知道如果包含在回滚的事务中,是否会取消诸如foreign_keys = OFF和VACUUM之类的pragmas。

对于不同的pragma语句是不同的。

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

然而,同一版本的SQLite明确地(在文档和测试中)从事务中排除了foreign_keys。

从我有限的抽样来看,在事务(foreign_key)期间未记录为无效的pragma将参与事务(如user_version.)

PS:我知道这是一个非常古老的问题,但当我需要这些信息时,它是谷歌带给我的。

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

这个pragma在事务中是no-op;外键约束只有在没有未决事项时才能启用或禁用强制执行开始或保存点

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

如果存在打开的事务或存在打开的事务,则VACUUM将失败

一个或多个活动SQL语句。

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

PRAGMA journal_mode=WAL;

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

SQL逻辑错误:不能从事务中更改为wal模式

最新更新