Estou trabalhando com o PostgreSQL 9.3 usando a psycopg2
API do banco de dados.
Eu tenho a API do banco de dados definida no nível mínimo de isolamento (modo "confirmação automática") e estou gerenciando minhas próprias transações diretamente via SQL. Exemplo:
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;")
Basicamente, a transação iniciada pelo cur.execute("BEGIN;")
limitado a apenas esse cursor ou é para toda a conexão ( self.conn.cursor()
)?
Algumas das coisas mais complexas que estou fazendo envolvem várias operações separadas do banco de dados, que eu logicamente decomponho em funções. Como tudo isso é de uma classe que tem a conexão como membro, é muito mais conveniente criar cursores dentro de cada função. No entanto, não tenho certeza de como funciona a criação de cursores em uma transação.
Basicamente, se as transações são por conexão, posso criar muitos cursores dinamicamente dentro da transação. Se eles são por cursor, isso significa que eu tenho que passar o cursor por toda parte. Qual é?
A documentação não aborda isso, embora o fato de você poder ligar connection.commit()
me deixe bastante confiante de que o controle de transações é por conexão.
fonte
begin
. Se nenhuma transação estiver aberta, uma nova será iniciada para você. Você apenascommit
delineia transações. Então, sim, o modelo DB-API faz transações explícitas de apoio.BEGIN
declarações automáticas . Não queropsycopg2
criar uma nova transação para cada umaSELECT
.BEGIN
é inofensivo e será apenas ignorado pelo PostgreSQLWARNING: there is already a transaction in progress
.Na documentação do psycopg2 :
Ao mesmo tempo, da versão 2.4.2, existe o
autocommit
atributo (ênfase adicionada):fonte