Использование BEGIN TRANSACTION / ROLLBACK / COMMIT для различных курсоров / соединений - PullRequest
3 голосов
/ 25 июня 2011

Мне интересно, как транзакции ведут себя, когда различные команды (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')

(На практике эти команды распределены по моему коду, и я пытаюсь выяснить, на каких уровнях вводить синглтоны)

Конечно, я в некоторой степени могу это выяснить, "попробовав", но я предпочитаю несколько более авторитетный ответ, так что я знаю, что с этого момента ничего не сломается.

Я использую API базы данных Python , хотя я полагаю, что этот вопрос не обязательно относится к Python. Я могу представить (хотя я надеюсь на обратное), что этот вопрос специфичен для БД. Для чего это стоит: мы используем MsSQL Server 2000.

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

То, что я до сих пор придумывал, - это потанцевать вокруг моего собственного вопроса, используя методы транзакций Python Database API для соединения вместо создания для них курсоров. Я еще не проверил его полностью, и посты здесь будут опубликованы, как только я это сделаю.

* 1005 Т.е. *

connection = pyodbc.connect(...)
connection.begin() # superfluous, but for illustration purposes;
cursor = connection.cursor()
cursor.execute('INSERT ....')
connection.commit() # or rollback    
1 голос
/ 24 октября 2014

Я не уверен насчет pyodbc - я думаю, это зависит от того, к какому конкретному ядру базы данных вы подключаетесь. К сожалению, похоже, что многие модули, которые реализуют API БД 2.0, не указывают в своей документации, являются ли транзакции специфичными для соединений или курсоров, а также не специфицируют саму API БД 2.0 (http://legacy.python.org/dev/peps/pep-0249/)

Однако, есть несколько баз данных, в которых транзакции включают все операторы, выполняемые всеми курсорами на одном соединении (это означает, что ваш первый и второй примеры будут работать). Например, документация psycopg2 прямо гласит следующее:

[D] команды atabase будут выполняться в контексте того же транзакция - не только команды, выданные первым курсором, но и выпущенные всеми курсорами, созданными одним и тем же соединением.

(в разделе «Контроль транзакций» в http://initd.org/psycopg/docs/usage.html)

Аналогично, MySQL не поддерживает курсоры - они эмулируются на уровне Python в модуле - поэтому по определению транзакция инкапсулирует весь уровень соединения, а не только один курсор.

...