Question

Je suis en train de mieux comprendre le concept de « validation automatique » lorsque vous travaillez avec une connexion Postgres (psycopg). Disons que j'ai une nouvelle connexion, réglez le niveau d'isolement ISOLATION_LEVEL_AUTOCOMMIT, puis exécutez ce SQL directement, sans utiliser les méthodes curseur commencer / rollback (comme un exercice, ne dis pas que je veux vraiment le faire):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

Qu'est-ce qui se passe à INSERTs C & D?

est autocommit est purement un cadre interne psycopg qui affecte la façon dont il émet COMMENCE? Dans ce cas, le SQL ci-dessus est unafected; INSERTs A & B se sont engagés dès qu'ils sont faits, alors que C & D sont exécutées dans une transaction et révulsés. Quel est le niveau d'isolement est cette transaction exécutée sous?

Ou est autocommit un vrai paramètre sur la connexion elle-même? Dans ce cas, comment cela affecte la manipulation de BEGIN? Est-il ignoré, ou faut-il passer outre la validation automatique paramètre pour réellement commencer une transaction? Quel est le niveau d'isolement est cette transaction exécutée sous?

Ou suis-je complètement hors-cible?

Était-ce utile?

La solution

mode Autocommit signifie que chaque énoncé commence implicitement et met fin à la transaction.

Dans votre cas, si la validation automatique est désactivée:

  • Le client démarre implicitement la transaction pour la première instruction
  • Le BEGIN émettra un avertissement disant que la transaction est déjà commencé
  • Le ROLLBACK nous roulera les quatre déclarations

Quand est autocommit, seul le c et d sont annulées.

Notez que PostgreSQL n'a pas de comportement AUTOCOMMIT interne depuis 8.0. Toutes autocommit fonctionnalités sont fié aux clients

Autres conseils

Par défaut, PostgreSQL a autocommit, ce qui signifie que chaque déclaration est traitée comme une transaction. Si vous dites explicitement commencer une transaction, comme dans votre exemple, ces articles sont dans une nouvelle transaction.

Dans votre exemple, A et B seraient engagés, C et D seraient annulées.

Quand est autocommit psycopg envoie juste que tout le serveur PostgreSQL sans essayer de gérer la transaction pour vous. Si vous n'utilisez BEGIN / COMMIT / ROLLBACK puis chaque appel .Execute () est immédiatement exécuté et engagé. Vous pouvez faire votre propre gestion des transactions par l'émission BEGIN / COMMIT / commandes ROLLBACK. Il est évident que dans le mode de validation automatique, vous ne pouvez pas appeler conn.commit () ou conn.rollback () parce psycopg ne garde pas trace des transactions, mais simplement d'envoyer tout ce que vous .Execute () directement au back-end.

Dans votre exemple A et B seraient engagés, C et D seraient annulées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top