【发布时间】:2012-11-18 12:58:03
【问题描述】:
如果我想创建一个表并在另一个表中插入一个新条目,可以这样吗? 在 sqlite 模块中成为原子的?
参考http://docs.python.org/2/library/sqlite3.html的文档:
默认情况下,sqlite3 模块在 数据修改语言 (DML) 语句(即 INSERT/UPDATE/DELETE/REPLACE),并隐式提交事务 在非 DML、非查询语句之前(即除 SELECT 或上述)。
因此,如果您在事务中并发出 CREATE 之类的命令 TABLE ...,VACUUM,PRAGMA,sqlite3 模块将隐式提交 在执行该命令之前。这样做有两个原因。 首先是其中一些命令在其中不起作用 交易。另一个原因是 sqlite3 需要跟踪 事务状态(事务是否处于活动状态)。
我不确定这第二段是否适用于自动启动 交易或手动和自动交易。
Sqlite 文档http://www.sqlite.org/lang_transaction.html 告诉我们手动交易 在明确的 COMMIT 之前不会提交:
可以使用 BEGIN 命令手动启动事务。这样的 事务通常持续到下一次 COMMIT 或 ROLLBACK 命令。
所以假设我们有这样的东西:
con = sqlite3.connect(fdb)
cur = con.cursor()
sql = 'begin transaciton'
cur.execute(sql)
sql = 'CREATE TABLE some-table ...
cur.execute(sql)
# *** is there an implicit commit at this point ?! ***
sql = 'INSERT INTO another-table ...
cur.execute(sql)
con.commit()
这是原子的,还是 python sqlite 在create table 语句之后提交?
有没有办法让它原子化?
【问题讨论】:
标签: python sqlite commit atomic