我现在知道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
仍然存在。
除了一些特殊的 PRAGMA(foreign_keys、journal_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")