在各种游标/连接上使用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级别上进行仿真-因此,根据定义,事务封装了整个连接级别,而不仅仅是单个游标。     

要回复问题请先登录注册