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

17 投票
2 回答
39394 浏览
提问于 2025-04-15 12:35

我有一个用户名需要在大约25个表里进行更改。(我知道,这听起来很麻烦。)为了处理这种情况,使用原子事务似乎是个不错的选择。不过,我不知道怎么用pyodbc来实现这一点。我之前看过一些关于原子事务的教程,但从来没有实际使用过。

我的环境是:Windows系统,Python 2.6,pyodbc,Microsoft SQL 2005。我用过pyodbc来执行单个SQL语句,但从来没有处理过复合语句或事务。

关于SQL的最佳实践似乎建议创建一个存储过程来处理这种情况。对于写存储过程,我有一些顾虑,按重要性排序如下: 1) 我从来没有写过存储过程。 2) 我听说pyodbc目前还不能从存储过程中返回结果。 3) 这绝对不是我的数据库。它是由供应商提供和更新的。

那么,处理这个问题的最佳方法是什么呢?

2 个回答

-9

我觉得pyodbc并没有特别支持事务的功能。你需要手动发送SQL命令来开始、提交或回滚事务。

29

根据它的文档,pyodbc确实支持事务,但前提是你的odbc驱动程序也得支持。此外,pyodbc遵循PEP 249,数据只有在你手动提交的时候才会被保存。
这意味着你必须明确地使用commit()来提交事务,或者使用rollback()来撤销整个事务。

需要注意的是,pyodbc还支持自动提交功能,在这种情况下,你就不能进行任何事务了。
默认情况下,自动提交是关闭的,但你的代码可能已经开启了这个功能。你应该在连接时检查一下。

cnxn = pyodbc.connect(cstring, autocommit=True)

另外,你也可以明确地关闭自动提交模式,方法是

cnxn.autocommit = False

但这可能会对你的系统产生很大的影响。

注意:你可以在它的wiki上获取更多关于pyodbc自动提交模式的信息。

撰写回答