Che cosa significa Postgres fare quando iniziare è eseguito su una connessione in modalità autocommit?

StackOverflow https://stackoverflow.com/questions/2478518

Domanda

sto cercando di capire meglio il concetto di 'autocommit' quando si lavora con una connessione Postgres (psycopg). Diciamo che ho una connessione fresco, impostare il livello di isolamento a ISOLATION_LEVEL_AUTOCOMMIT, quindi eseguire questo SQL direttamente, senza utilizzare il cursore inizierà metodi / rollback (come un esercizio, non dicendo che in realtà voglio fare questo):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

Quello che succede agli inserti C & D?

E 'autocommit è puramente un ambiente interno in psycopg che colpisce come emette inizia? In tal caso, il sopra SQL è unafected; Inserisce un & B sono impegnati non appena hanno finito, mentre la C & S vengono eseguiti in una transazione e rollback. Qual è il livello di isolamento è tale transazione eseguita sotto?

In alternativa è autocommit un ambiente reale sul collegamento stesso? In tal caso, come influisce la gestione di cominciare? È ignorato, o lo fa sostituire l'impostazione per iniziare effettivamente una transazione di commit automatico? Qual è il livello di isolamento è tale transazione eseguita sotto?

O sono completamente fuori bersaglio?

È stato utile?

Soluzione

Modalità Autocommit significa che ogni affermazione inizia implicitamente e la transazione si conclude.

Nel tuo caso, se autocommit è spento:

  • Il client implicitamente avviare la transazione per la prima istruzione
  • Il BEGIN emetterà un avviso dicendo che l'operazione è già stato avviato
  • Il ROLLBACK rotolerà di nuovo tutte e quattro le dichiarazioni

Quando autocommit è attivo, solo il c e d rollback.

Si noti che PostgreSQL ha nessun comportamento AUTOCOMMIT interno dal 8.0:. Tutte AUTOCOMMIT caratteristiche sono invocati i clienti

Altri suggerimenti

Per impostazione predefinita, PostgreSQL ha autocommit, il che significa che ogni affermazione viene gestito come una transazione. Se esplicitamente dice di avviare una transazione, come nel tuo esempio, tali elementi sono in una nuova transazione.

Nel tuo esempio, A e B sarebbero stati commessi, C e D sarebbe rollback.

Quando autocommit è in psycopg solo invia tutto al backend PostgreSQL senza cercare di gestire la transazione per voi. Se non si utilizza INIZIARE / commit / ROLLBACK poi ogni .execute () chiamata viene immediatamente eseguito e impegnato. È possibile fare la propria gestione delle transazioni mediante l'emissione di BEGIN / COMMIT comandi / rollback. Ovviamente in modalità autocommit non è possibile chiamare conn.commit () o conn.rollback () perché psycopg non è tenere traccia delle operazioni, ma solo l'invio di qualsiasi cosa si .execute () direttamente al backend.

Nel tuo esempio A e B sarebbe impegnata, C e D saranno annullate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top