new*_*ver 8 python sql python-db-api
使用mysql-python中的游标我曾经称之为"BEGIN;","COMMIT;"和"ROLLBACK;" 明确如下:
try:
cursor.execute("BEGIN;")
# some statements
cursor.execute("COMMIT;")
except:
cursor.execute("ROLLBACK;")
Run Code Online (Sandbox Code Playgroud)
然后,我发现底层连接对象有相应的方法:
try:
cursor.connection.begin()
# some statements
cursor.connection.commit()
except:
cursor.connection.rollback()
Run Code Online (Sandbox Code Playgroud)
检查DB-API PEP我发现它没有提到连接对象的begin()方法,即使对于扩展也是如此.
顺便说一下,当您使用该方法时,Mysql-python会抛出DeprecationWarning.例如,sqlite3.connection根本就没有这个方法.
问题是为什么PEP中没有这样的方法?该语句是否可选,是否足以调用commit()?
看看这个先前提出的问题.通常,与事务一起使用的"协议"是:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
Run Code Online (Sandbox Code Playgroud)
从python 2.6开始,sqlite Connection对象可以用作自动提交或回滚事务的上下文管理器.
决定回答自己:
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 没有反映它。