SQLite 中的事务

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

我现在知道MySQL中有一个list会导致隐式提交,比如

CREATE
ALTER
等,我想知道SQLite中是否有这样的东西。

换句话说,我想知道,例如,

CREATE TABLE
和其他一些构造是否会导致自动提交,因此无法回滚?

我自己测试了它,在我看来,SQLite 的行为就像 MySQL,但我不确定这一点,我想参考列出所有此类命令的文档(我找不到)。

此外,我想知道是否可以调整一些 SQLite 参数以防止其形成自动提交

CREATE
和其他语句。

我们都知道,例如,不可能重命名 SQLite 中的字段或更改其类型(使用一个命令),但为了做到这一点,我们必须创建一个具有所需架构的新表并将数据导入到该表中。显然,这样的操作应该在单个事务中实现,但是如果事实上

CREATE TABLE
DROP TABLE
命令导致自动提交怎么办?

反例:

import sqlite3

cnx = sqlite3.connect("test.db")
cursor = cnx.cursor()
cursor.execute("CREATE TABLE funky (attr_1_ integer)")
cnx.rollback()

如您所见,我没有使用任何特殊的编译指示,甚至没有显式提交,但是当我运行它然后转到 sqlite3 提示符时,我看到表

funky
仍然存在。

sqlite
1个回答
3
投票

除了一些特殊的 PRAGMA(foreign_keysjournal_mode)之外,所有 SQL 命令都是完全事务性

除了在事务内之外,不能对数据库进行任何更改。

仅当您不使用显式事务时,SQLite 才会使用自动提交:

任何更改数据库的命令(基本上是除 SELECT 之外的任何 SQL 命令)都会自动启动事务(如果事务尚未生效)。自动启动的事务将在最后一个查询完成时提交。


为了能够回滚 CREATE TABLE,您必须

import sqlite3

cnx = sqlite3.connect("test.db")
cnx.isolation_level = None
cursor = cnx.cursor()
cursor.execute("BEGIN")
cursor.execute("CREATE TABLE funky (attr_1_ integer)")
cursor.execute("ROLLBACK")
© www.soinside.com 2019 - 2024. All rights reserved.