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

Bas*_*ani 8 python sqlite commit atomic

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

请参阅http://docs.python.org/2/library/sqlite3.html上的文档:

默认情况下,sqlite3模块在数据修改语言(DML)语句(即INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非DML非查询语句(即SELECT或其他任何语句)之前隐式提交事务.之前所提).

因此,如果您在事务中并发出类似CREATE TABLE ...,VACUUM,PRAGMA的命令,则sqlite3模块将在执行该命令之前隐式提交.这样做有两个原因.首先,其中一些命令在事务中不起作用.另一个原因是sqlite3需要跟踪事务状态(如果事务处于活动状态).

我不确定这第二段是否适用于自动启动的交易或手动和自动交易.

Sqlite docs 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()
Run Code Online (Sandbox Code Playgroud)

这会是原子的,还是python sqlite会在create table声明后进行提交?有没有办法让它成为原子?

Mar*_*ers 6

你不能原子地这样做.COMMIT每当执行CREATE TABLE ..语句时,Python SQLite库都会隐式发出,因为SQLite不支持CREATE TABLE ..在事务处于活动状态时执行语句.

您可以通过在python解释器和sqlite3命令行工具中打开数据库来测试它.一旦发出该CREATE TABLE ..语句,就可以.schemasqlite3命令行工具中运行命令并查看该语句的结果.

请注意,这意味着,任何你在做交易之前CREATE TABLE ..声明也已经提交.要以另一种方式查看,CREATE TABLE ..语句首先提交,然后启动一个全新的事务.


CL.*_*CL. 3

Python SQLite3 库会插入自动提交,即使不需要。

要使整个事务原子化,请使用任何其他 Python SQLite 包装器,例如APSW

  • 如果 sqlite3 正在消除原子性,那么他们至少应该在文档中强调这样的问题。 (2认同)