在Python中,如何使用pyodbc执行事务?

在Python中,如何使用pyodbc执行事务?,python,transactions,pyodbc,Python,Transactions,Pyodbc,我有一个用户名,我必须在许多(多达25个)表中更改它。(是的,我知道。)原子事务似乎是解决这类问题的方法。但是,我不知道如何使用pyodbc实现这一点。我以前看过关于原子事务的各种教程,但从未使用过它们 安装程序:Windows平台、Python 2.6、pyodbc、Microsoft SQL 2005。我对单个SQL语句使用了pyodbc,但没有复合语句或事务 SQL的最佳实践似乎表明,创建存储过程非常适合这一点。我对执行存储过程的担心如下,按重要性的增加顺序排列: 1) 我从未编写过存储过

我有一个用户名,我必须在许多(多达25个)表中更改它。(是的,我知道。)原子事务似乎是解决这类问题的方法。但是,我不知道如何使用pyodbc实现这一点。我以前看过关于原子事务的各种教程,但从未使用过它们

安装程序:Windows平台、Python 2.6、pyodbc、Microsoft SQL 2005。我对单个SQL语句使用了pyodbc,但没有复合语句或事务

SQL的最佳实践似乎表明,创建存储过程非常适合这一点。我对执行存储过程的担心如下,按重要性的增加顺序排列: 1) 我从未编写过存储过程。 2) 我听说pyodbc到目前为止还没有从存储过程返回结果。 3) 这绝对不是我的数据库。它由供应商提供,供应商更新,等等


那么,最好的办法是什么

我认为pyodbc对事务没有任何特定的支持。您需要发送SQL命令来启动/提交/回滚事务。

通过它,pyodbc确实支持事务,但仅当odbc驱动程序支持它时。此外,由于pyodbc与兼容,只有在手动提交时才存储数据。
这意味着您必须明确地
commit()
事务,或
rollback()
整个事务

请注意,pyodbc还支持自动提交功能,在这种情况下,您不能有任何事务。
默认情况下,“自动提交”处于禁用状态,但您的代码库可能已将其启用。 执行连接时,应检查连接

cnxn = pyodbc.connect(cstring, autocommit=True)
或者,您也可以通过以下方式明确关闭自动提交模式:

cnxn.autocommit = False
但这可能会对您的系统产生相当大的影响


注意:您可以在pyodbc的

上获得有关pyodbc自动提交模式的更多信息。上面的wiki链接仍然存在,但已经过时(目前由Google代码存档)。pyodbc github事务文档中的此页面提供addl info:autocommit根据PEP 249默认为关闭:“请注意,如果数据库支持自动提交功能,则此功能最初必须关闭。”