python sqlite“BEGIN TRANSACTION”和“COMMIT”命令

时间:2014-11-06 02:22:41

标签: python sqlite transactions

如果我想通过python在我的数据库中启动一个事务,我必须像这样明确地执行sql命令'BEGIN TRANSACTION':

import sqlite3

conn = sqlite3.connect(db)
c = conn.cursor()

c.execute('BEGIN TRANSACTION;')
##... some updates on the database ...
conn.commit() ## or c.execute('COMMIT'). Are these two expressions the same?

当我建立连接或开始交易时,数据库是否已锁定以便从其他客户端进行更改?

3 个答案:

答案 0 :(得分:2)

只有事务才能锁定数据库。

然而,Python试图变得聪明并且automatically begins transactions

  

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

     

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

     

您可以通过 isolation_level 参数来控制BEGIN语句sqlite3隐式执行(或根本不执行)connect()调用,或通过连接的isolation_level属性。

     

如果您想要自动提交模式,请将isolation_level设置为无。

     

否则将其保留为默认值,这将产生一个简单的“BEGIN”语句,或将其设置为SQLite支持的隔离级别之一:“DEFERRED”,“IMMEDIATE”或“EXCLUSIVE”。

答案 1 :(得分:1)

来自python docs

  

当多个连接访问数据库,并且其中一个进程修改数据库时,SQLite数据库将被锁定,直到提交该事务为止。 timeout参数指定连接在引发异常之前等待锁定消失的时间。 timeout参数的默认值为5.0(五秒)。

答案 2 :(得分:0)

如果我想通过python在数据库中启动事务,我必须像下面这样显式执行sql命令“ BEGIN TRANSACTION”:

这取决于您是处于自动提交模式(在这种情况下为是)还是处于手动提交模式(在这种情况下,在DML语句之前为否,但不幸的是,在DDL或DQL语句之前为是,因为手动提交模式未正确实现在当前版本的SQLite3数据库驱动程序中,请参见下文)。

conn.commit()##或c.​​execute('COMMIT')。这两个表达式是否相同?

是的

建立连接或开始事务时,数据库是否被锁定以防止其他客户端更改?

开始交易时(请参阅SQLite3 documentation)。

要更好地了解自动提交和手动提交模式,请阅读this answer