在各种游标/连接上使用BEGIN TRANSACTION / ROLLBACK / COMMIT

时间:2011-06-25 13:23:08

标签: python database transactions

我想知道在各种游标/连接上给出各种命令(开始/开始事务,提交等)时事务的行为。即,以下哪些语句实际上引入了单个事务并在最后提交它?

connection = pyodbc.connect(...)
cursor = connection.cursor()
cursor.execute('START TRANSACTION')
cursor.execute('INSERT ....')
cursor.execute('COMMIT')

VS

connection = pyodbc.connect(...)
connection.cursor().execute('START TRANSACTION')
connection.cursor().execute('INSERT ....')
connection.cursor().execute('COMMIT')

VS

pyodbc.connect(...).cursor().execute('START TRANSACTION')
pyodbc.connect(...).cursor().execute('INSERT ....')
pyodbc.connect(...).cursor().execute('COMMIT')

(实际上,这些命令分散在我的代码上,我试图找出引入单例的级别)

当然,我可以通过“尝试”在某种程度上找到它,但我更喜欢一个更具有说服力的答案,所以我知道一些事情从现在开始不会破坏。

我正在使用Python's Database API,但我认为这个问题不一定是特定于python的。 我可以想象(虽然我希望相反)这个问题是特定于数据库的。值得一提的是:我们正在使用MsSQL Server 2000。

2 个答案:

答案 0 :(得分:2)

到目前为止我想出的是通过使用Python的Database API的交易方法连接来绕过我自己的问题,而不是为它们创建游标。我还没有以彻底的方式对它进行测试,我会尽快在这里发布答案。

connection = pyodbc.connect(...)
connection.begin() # superfluous, but for illustration purposes;
cursor = connection.cursor()
cursor.execute('INSERT ....')
connection.commit() # or rollback    

答案 1 :(得分:1)

我不确定pyodbc--我想这取决于你连接的是哪个特定的数据库引擎。不幸的是,似乎许多实现DB API 2.0的模块没有在其文档中指定事务是否特定于连接或游标,DB API 2.0本身的规范(http://legacy.python.org/dev/peps/pep-0249/

但是,有几个数据库,其中事务包括所有游标在单个连接上执行的所有语句(这意味着您的第一个和第二个示例都将起作用)。例如,psycopg2文档明确说明了以下内容:

  

[D] atabase命令将在相同的上下文中执行   transaction - 不仅是第一个游标发出的命令,而且   由同一连接创建的所有游标发布的那些。

(在http://initd.org/psycopg/docs/usage.html中的“交易控制”下)

类似地,MySQL不支持游标 - 它们在模块中的Python级别进行模拟 - 因此根据定义,事务封装整个连接级别,而不仅仅是单个游标。