8

在 mysql-python 中使用游标我曾经调用“BEGIN;”、“COMMIT;”和“ROLLBACK;” 明确如下:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")

然后,我发现底层的连接对象有相应的方法:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()

检查DB-API PEP我发现它没有提到连接对象的 begin() 方法,即使是扩展也是如此。

顺便说一句,当您使用该方法时,Mysql-python 会抛出 DeprecationWarning。例如 sqlite3.connection 根本没有该方法。

问题是为什么 PEP 中没有这种方法?该语句是否以某种方式可选,是否足以代替调用 commit() ?

4

2 回答 2

8

看看这个以前问过的问题。通常,与事务一起使用的“协议”是:

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()

从 python 2.6 开始,sqliteConnection对象可以用作自动提交或回滚事务的上下文管理器

于 2010-03-30T17:39:41.797 回答
4

决定回答自己:

python-list 中关于 DB API 2.0 事务的线程和以下引人注意的书SQL The Complete Reference的摘录让我认为 DB API 实现了 SQL1 标准行为:

SQL 标准的第一个版本 (SQL1) 基于 DB2 早期版本中的事务支持定义了一种隐式事务模式。在隐式模式下,仅支持 COMMIT 和 ROLLBACK 语句。SQL 事务从用户或程序执行的第一条 SQL 语句自动开始,并在执行 COMMIT 或 ROLLBACK 时结束。一个事务的结束隐含地开始一个新的事务。

当 RDBSM 支持自动提交模式并且当前连接处于该模式时,显式事务模式(SQL2 和 SQL:1999)似乎很方便,但 DB API 只是没有反映它。

于 2010-05-07T11:42:05.200 回答