Je travaille avec PostgreSQL 9.3 en utilisant l' psycopg2
API de base de données.
J'ai l'API DB définie au niveau d'isolement minimum (mode "autocommit") et je gère mes propres transactions directement via SQL. Exemple:
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;")
Fondamentalement, la transaction qui est lancée par le cur.execute("BEGIN;")
limité est-elle uniquement à ce curseur, ou est-ce pour l'ensemble de la connexion ( self.conn.cursor()
)?
Certaines des choses les plus complexes que je fais impliquent plusieurs opérations de base de données distinctes, que je décompose logiquement en fonctions. Comme tout est dans une classe qui a la connexion en tant que membre, il est beaucoup plus pratique de créer des curseurs dans chaque fonction. Cependant, je ne sais pas comment fonctionne la création de curseurs dans une transaction.
Fondamentalement, si les transactions sont par connexion, je peux simplement créer de nombreux curseurs à la volée dans la transaction. S'ils sont par curseur, cela signifie que je dois faire passer le curseur partout. Lequel est-ce?
La documentation ne touche pas à cela, bien que le fait que vous puissiez appeler connection.commit()
me donne assez confiance que le contrôle des transactions est par connexion.
la source
begin
. Si aucune transaction n'est ouverte, une nouvelle est lancée pour vous. Vous venezcommit
de délimiter les transactions. Alors oui, le modèle DB-API prend en charge les transactions explicites.BEGIN
déclarations automatiques . Je ne veuxpsycopg2
pas créer de nouvelle transaction pour chacunSELECT
.BEGIN
est inoffensif et sera simplement ignoré par PostgreSQL avecWARNING: there is already a transaction in progress
.De la documentation psycopg2 :
En même temps, à partir de la version 2.4.2, il y a l'
autocommit
attribut (soulignement ajouté):la source