【问题标题】:python sqlite "BEGIN TRANSACTION" and "COMMIT" commandspython sqlite "BEGIN TRANSACTION" 和 "COMMIT" 命令
【发布时间】:2014-11-06 02:22:41
【问题描述】:

如果我想通过 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 sqlite transactions


    【解决方案1】:

    只有事务锁定数据库。

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

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

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

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

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

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

    【讨论】:

    • "因此,如果您在事务中并发出 CREATE TABLE ...、VACUUM、PRAGMA 之类的命令,sqlite3 模块将在执行该命令之前隐式提交。"来自docs.python.org/3.6/library/…:“3.6 版更改:sqlite3 用于在 DDL 语句之前隐式提交打开的事务。现在不再是这种情况。”
    • @DaleZ 它仍然会自动打开它们,现在你不知道事务是否隐式提交......
    【解决方案2】:

    来自python docs

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

    【讨论】:

    • 不,你不需要执行BEGIN TRANSACTION
    • 所以 BEGIN TRANSACTION 是通过打开连接来暗示的?
    • 据我了解,是的,它是隐含的。我鼓励您在 sqlite3 shell 上以here 的身份运行一些代码,以便快速测试它。换个角度看,如果你进入python标准库源代码,看看/sqlite3/dump.py,我认为上面的代码使用的是什么,你会看到BEGIN TRANSACTION语句是自动为你完成的。
    【解决方案3】:

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

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

    conn.commit() ## 或 c.execute('COMMIT')。这两个表达是一样的吗?

    是的。

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

    当您开始交易时(参见SQLite3 documentation)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多