Я делаю некоторую работу с PostgreSQL 9.3, используя psycopg2
API базы данных.
У меня API БД установлен на минимальном уровне изоляции (режим «автокоммит»), и я управляю своими собственными транзакциями напрямую через SQL. Пример:
cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")
По сути, транзакция, которая запускается cur.execute("BEGIN;")
ограниченным только этим курсором, или это для всего соединения ( self.conn.cursor()
)?
Некоторые из более сложных вещей, которые я делаю, включают несколько отдельных операций с базой данных, которые я логически разбиваю на функции. Поскольку это все в классе, который имеет соединение в качестве члена, гораздо удобнее создавать курсоры внутри каждой функции. Однако я не уверен, как работает создание курсоров в транзакции.
По сути, если транзакции относятся к каждому соединению, я могу просто создавать множество курсоров внутри транзакции. Если они для каждого курсора, это означает, что я должен перемещать курсор повсюду. Что он?
Документация не касается этого, хотя тот факт , что вы можете назвать connection.commit()
делает меня довольно уверен , что сделка, контроль за соединение.
источник
begin
. Если ни одна транзакция не открыта, для вас запускается новая. Вы простоcommit
разграничить транзакции. Так что да, модель DB-API делает поддержку явные транзакции.BEGIN
утверждений. Я не хочуpsycopg2
создавать новую транзакцию для каждойSELECT
.BEGIN
безвредны и будут просто игнорироваться PostgreSQLWARNING: there is already a transaction in progress
.Из документации psycopg2 :
В то же время, начиная с версии 2.4.2, есть
autocommit
атрибут (выделение добавлено):источник