小编典典

在python sqlite3模块中提交行为和原子性

python

如果我想创建一个表并在另一个表中插入新条目,可以在sqlite模块中将其设置为原子吗?

参考位于http://docs.python.org/2/library/sqlite3.html的文档:

默认情况下,sqlite3模块在数据修改语言(DML)语句(即INSERT / UPDATE / DELETE /
REPLACE)之前隐式地打开事务,并在非DML,非查询语句(即SELECT或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()

这是原子的,还是在create table语句后python sqlite进行提交?有没有办法使它原子化?


阅读 219

收藏
2021-01-20

共1个答案

小编典典

Python SQLite3库插入自动提交,即使在不需要的地方也是如此。

为了使整个事务具有原子性,请使用任何其他Python SQLite包装器,例如APSW

2021-01-20