【问题标题】:Using BEGIN TRANSACTION / ROLLBACK / COMMIT over various cursors / connections在各种游标/连接上使用 BEGIN TRANSACTION / ROLLBACK / COMMIT
【发布时间】:2011-06-25 13:23:08
【问题描述】:

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

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 的。 我可以想象(尽管我确实希望相反)这个问题是特定于数据库的。值得一提的是:我们使用的是 MsSQL Server 2000。

【问题讨论】:

    标签: python database transactions


    【解决方案1】:

    到目前为止,我想出的是通过使用 Python 的数据库 API 的事务方法 on connection 来解决我自己的问题,而不是为它们创建游标。我还没有对它进行彻底的测试,一旦我这样做了就会在这里发布答案。

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

    【讨论】:

      【解决方案2】:

      我不确定 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 级别模拟的——因此根据定义,事务封装了整个连接级别,而不仅仅是单个游标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多