如果我想通过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 ...VACUUMPRAGMA之类的命令,则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/

10-08 22:27
查看更多