使用BEGIN TRANSACTION / ROLLBACK / COMMIT 在不同的游标/连接上

2024-04-25 16:47:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道当各种命令(Begin/Start Transaction、Commit等)通过各种游标/连接发出时,事务是如何工作的。一、 例如,以下哪一组语句实际上引入了一个事务并在最后提交它?

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

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

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

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

当然,在某种程度上,我可以通过“尝试”来找到答案,但我更喜欢一个更具权威性的答案,这样我就知道一个星期后事情不会中断。

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


Tags: 答案命令executeconnectconnection事务startcursor
2条回答

到目前为止,我想到的是在连接上使用Python的Database API的事务方法来绕过我自己的问题,而不是为它们创建游标。我还没有彻底测试过,我一做就在这里发布答案。

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

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

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

[D]atabase commands will be executed in the context of the same transaction – not only the commands issued by the first cursor, but the ones issued by all the cursors created by the same connection.

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

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

相关问题 更多 >