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.