如果我想通过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?
建立连接或开始事务时,数据库是否被锁定以防其他客户端更改?
最佳答案
只有事务锁定数据库。
但是,Python尝试变得聪明并且automatically begins transactions:
默认情况下,sqlite3
模块在数据修改语言(DML)语句(即INSERT
/ UPDATE
/ DELETE
/ REPLACE
)之前隐式打开事务,并在非DML,非DLM之前隐式提交事务。 -query语句(即除SELECT
或上述内容以外的任何内容)。
因此,如果您在事务中并发出CREATE TABLE ...
,VACUUM
,PRAGMA
之类的命令,则sqlite3
模块将在执行该命令之前隐式提交。这样做有两个原因。首先是这些命令中的某些命令在事务内不起作用。另一个原因是sqlite3需要跟踪事务状态(无论事务是否处于活动状态)。
您可以通过对BEGIN
调用的isolation_level参数或通过连接的sqlite3
属性,隐式执行(或根本不执行)哪种connect()
语句。
如果要使用自动提交模式,则将isolation_level
设置为“无”。
否则,将其保留为默认值,这将导致出现简单的“ BEGIN”语句,或将其设置为SQLite支持的隔离级别之一:“ DEFERRED”,“ IMMEDIATE”或“ EXCLUSIVE”。
关于python - python sqlite“BEGIN TRANSACTION”和“COMMIT”命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26770719/