使用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()?
答案 0 :(得分:7)
看a this previously asked question。通常,与事务一起使用的“协议”是:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
从python 2.6 sqlite Connection
objects can be used as context managers that automatically commit or rollback transactions开始。
答案 1 :(得分:4)
决定回答自己:
python-list中的thread about DB API 2.0 transactions以及明显的书SQL The Complete Reference中的以下摘录让我认为DB API实现了SQL1标准行为:
SQL标准的第一个版本 (SQL1)定义了一个隐式事务 模式,基于交易 在早期版本的DB2中提供支持。 在隐式模式下,只有COMMIT和 支持ROLLBACK语句。一个 SQL事务自动开始 执行第一个SQL语句 由用户或程序结束时a 执行COMMIT或ROLLBACK。该 隐含地结束一次交易 开始一个新的。
当RDBSM支持自动提交模式并且当前连接处于该模式时,显式事务模式(SQL2和SQL:1999)似乎很方便,但DB API只是没有反映它。