为什么Python的DB-API连接没有"begin"操作?

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()是否足够?

2个回答

8

感谢您提供有关邻居问题的有用链接。虽然这不是我问题的答案,但它为可能的原因提供了一些线索。 - newtover
@newtower:你说得对,我曾经犹豫是回答还是只发表评论,但这样做我可以发布那个小片段。 - mg.
顺便说一下,虽然使用上下文管理器包装连接很有用,但我更喜欢在相邻的查询中重用连接,但是游标类甚至在Python 2.6中也没有实现上下文管理器接口。 - newtover
3
根据文档,似乎应该使用conn.rollback()conn.commit()而不是cursor.rollback()cursor.commit()。我有所遗漏吗? - max

4

自己来回答:

python-list中关于DB API 2.0事务的讨论和著名书籍SQL完全参考手册的以下摘录,让我觉得DB API实现了SQL1标准的行为:

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

显式事务模式(SQL2和SQL:1999)在RDBSM支持autocommit模式且当前连接处于该模式时非常方便,但DB API并没有反映出它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接