2015-12-02 138 views
3

我现在知道MySQL存在导致隐性承诺,像CREATEALTER等语句的长隆list我想知道是否有这样的事情在SQLite交易SQLite中

换句话说,我想知道例如CREATE TABLE和其他一些构造是否会导致自动提交,因此无法回滚?

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

此外,我想知道是否可以调整一些sqlite参数,以防止它形成自动提交CREATE和其他语句。

编辑

一个额外的思考。我们都知道,例如,无法重命名SQLite中的字段或更改其类型(使用一个命令),但为此,我们必须创建一个具有所需模式的新表并将数据导入到此表中。显然,这样的操作应该在单个事务中执行,但是如果实际上CREATE TABLEDROP TABLE命令会导致自动提交?

相反实施

import sqlite3 

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

正如你所看到的,我不使用任何特殊的编译,我甚至不提交明确的,但是当我运行它,然后去SQLITE3提示,我看到表funky仍然存在。

回答

3

对于一些特殊的程序(foreign_keysjournal_mode)外,所有SQL命令是fully transactional

不可更改的数据库事务之外,制成。

只有当你不使用显式事务的SQLite将使用autocommits:

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


为了能够回滚一个CREATE TABLE,你必须

  • 使用明确的事务,并
  • (只在Python)禁用Python的autocommit mode
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") 
+0

如果你能详细阐述一下,这将是很好的。事实是,我自己的测试没有使用任何特殊的杂注显示,例如'CREATE TABLE' autocommits。我猜还有另外一些命令也会导致隐式提交。所以,如果你能用可证实的例子来支持你的想法,那就太好了。 – Jacobian

+0

这个问题是关于SQLite的,而不是关于[Python被误导为聪明的尝试](https://docs.python.org/2/library/sqlite3.html#sqlite3-controlling-transactions)。 –

+0

我会接受你的答案,如果你有点冗长。现在我无法理解你在这两个短句中的实际含义。 – Jacobian