如何解决在各种游标/连接上使用BEGIN TRANSACTION / ROLLBACK / 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的数据库API,尽管我认为这个问题不一定是特定于python的。
我可以想象(尽管我希望相反),这个问题是特定于DB的。物有所值:我们正在使用Mssql Server 2000。
解决方法
到目前为止,我想到的是通过在连接上使用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的模块在其文档中都没有指定事务是特定于连接还是游标,也没有指定DB API 2.0本身的规范(http://legacy.python .org / dev / peps / pep-0249 /)
但是,在几个数据库中,事务包含单个连接上所有游标执行的所有语句(这意味着您的第一个示例和第二个示例都可以使用)。例如,psycopg2文档明确声明了以下内容:
[D]数据库命令将在相同的上下文中执行
事务–不仅是第一个游标发出的命令,而且
由同一连接创建的所有游标发出的游标。
(在http://initd.org/psycopg/docs/usage.html中的“交易控制”下)
同样,MySQL不支持游标-它们在模块的Python级别上进行仿真-因此,根据定义,事务封装了整个连接级别,而不仅仅是单个游标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。