如果我想创建一个表并在另一个表中插入新条目,这是否可以在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告诉我们,手动事务直到显式提交才会提交:
使用BEGIN命令可以手动启动事务。这种事务通常持久到下一个COMMIT或ROLLBACK命令。
所以假设我们有这样的东西:
这个操作是原子性的吗,还是Python 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告诉我们,手动事务直到显式提交才会提交:
使用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
语句后进行提交呢?
有没有办法使其具有原子性?