如果我想通过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?
当我建立连接或开始交易时,数据库是否已锁定以便从其他客户端进行更改?
答案 0 :(得分:2)
只有事务才能锁定数据库。
然而,Python试图变得聪明并且automatically begins transactions:
默认情况下,
sqlite3
模块在数据修改语言(DML)语句之前隐式打开事务(即INSERT
/UPDATE
/DELETE
/REPLACE
),并在非DML,非查询语句(即SELECT
或上述之外的任何语句)之前隐式提交事务。因此,如果您在事务中并发出
CREATE TABLE ...
,VACUUM
,PRAGMA
之类的命令,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。