如果我想创建一个表,然后插入另一个表中的新条目,可以在此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()
请问这是原子,或将蟒蛇的SQLite使后提交create table
的语句? 有没有办法让它原子?