Question Comment faire des transactions de base de données avec psycopg2 / python db api?


En bidouillant psycopg2, et s'il y a un .commit () et un .rollback () il n'y a pas de .begin () ou similaire pour démarrer une transaction, ou du moins semble-t-il? Je m'attendais à pouvoir faire

db.begin() # possible even set the isolation level here
curs = db.cursor()
cursor.execute('select etc... for update')
...
cursor.execute('update ... etc.')
db.commit();

Alors, comment les transactions fonctionnent-elles avec psycopg2? Comment définir / modifier le niveau d'isolement?


19
2017-08-02 17:26


origine


Réponses:


Utilisation db.set_isolation_level(n), en supposant db est votre objet de connexion. Comme Federico a écrit ici, le sens de n est:

0 -> autocommit
1 -> read committed
2 -> serialized (but not officially supported by pg)
3 -> serialized

Comme documenté ici, psycopg2.extensions vous donne des constantes symboliques dans le but:

Setting transaction isolation levels
====================================

psycopg2 connection objects hold informations about the PostgreSQL `transaction
isolation level`_.  The current transaction level can be read from the
`.isolation_level` attribute.  The default isolation level is ``READ
COMMITTED``.  A different isolation level con be set through the
`.set_isolation_level()` method.  The level can be set to one of the following
constants, defined in `psycopg2.extensions`:

`ISOLATION_LEVEL_AUTOCOMMIT`
    No transaction is started when command are issued and no
    `.commit()`/`.rollback()` is required.  Some PostgreSQL command such as
    ``CREATE DATABASE`` can't run into a transaction: to run such command use
    `.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)`.

`ISOLATION_LEVEL_READ_COMMITTED`
    This is the default value.  A new transaction is started at the first
    `.execute()` command on a cursor and at each new `.execute()` after a
    `.commit()` or a `.rollback()`.  The transaction runs in the PostgreSQL
    ``READ COMMITTED`` isolation level.

`ISOLATION_LEVEL_SERIALIZABLE`
    Transactions are run at a ``SERIALIZABLE`` isolation level.


.. _transaction isolation level: 
   http://www.postgresql.org/docs/8.1/static/transaction-iso.html

24
2017-08-02 17:47



le BEGIN avec python, l'API DB standard est toujours implicite. Lorsque vous commencez à travailler avec la base de données, le pilote émet un BEGIN et après tout COMMIT ou ROLLBACK un autre BEGIN est délivré. Une API de base de données python conforme à la spécification devrait toujours fonctionner de cette manière (pas seulement le fichier postgresql).

Vous pouvez modifier ce paramètre au niveau d'isolation à autocommit avec db.set_isolation_level(n) comme indiqué par Alex Martelli.

Comme Tebas a déclaré que le début est implicite mais pas exécuté tant qu'un SQL n'est pas exécuté, si vous n'exécutez aucun SQL, la session ne se trouve pas dans une transaction.


13
2017-08-12 11:03



Je préfère voir explicitement où sont mes transactions:

  • cursor.execute ("BEGIN")
  • cursor.execute ("COMMIT")

5
2017-08-04 10:18