Qu'est-ce que Postgres faire lorsque BEGIN est exécuté sur une connexion en mode autocommit?
-
21-09-2019 - |
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?
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.