¿Qué hacer cuando Postgres comenzar es correr en una conexión en modo de confirmación automática?

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

Pregunta

Estoy tratando de comprender mejor el concepto de 'confirmación automática' cuando se trabaja con una conexión de Postgres (psycopg). Digamos que tengo una conexión nueva, establezca su nivel de aislamiento a ISOLATION_LEVEL_AUTOCOMMIT, a continuación, ejecutar este SQL directamente, sin necesidad de utilizar el cursor comenzará métodos / rollback (como un ejercicio; sin decir realmente lo que quiero hacer esto):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

Lo que sucede con inserciones C + D?

Es confirmación automática es puramente un ajuste interno en psycopg que afecta a la forma en que emite comienza? En ese caso, el SQL anterior es unafected; INSERT A y B están comprometidos, tan pronto como se haya terminado, mientras que C y D se ejecutan en una transacción y deshacen. ¿Qué nivel de aislamiento es que la transacción se ejecuta bajo?

O se Autocommit un entorno real sobre la propia conexión? En ese caso, ¿cómo afecta el manejo de empezar? Es ignorado, o se redefina la opción para iniciar una transacción de confirmación automática en realidad? ¿Qué nivel de aislamiento es que la transacción se ejecuta bajo?

O estoy completamente fuera de objetivo?

¿Fue útil?

Solución

significa el modo de confirmación automática de que cada declaración implícita comienza y termina la transacción.

En su caso, si el compromiso automático está apagado:

  • El cliente se iniciará implícitamente la transacción por primera declaración
  • El BEGIN emitirá una advertencia diciendo que la transacción ya se ha iniciado
  • El ROLLBACK va a hacer retroceder las cuatro declaraciones

Cuando el compromiso automático está activado, sólo el c y d se deshace.

Tenga en cuenta que PostgreSQL tiene ningún comportamiento AUTOCOMMIT interna desde 8.0:. Todas las características de confirmación automática se depende de los clientes

Otros consejos

Por defecto, PostgreSQL tiene la ejecución automática en adelante, lo que significa que cada declaración se maneja como una transacción. Si usted le dice explícitamente en él para iniciar una transacción, como en el ejemplo, los artículos están en una nueva transacción.

En su ejemplo, A y B se comprometerían, C y D podría ser revertido.

Cuando confirmación automática está en psycopg simplemente envía todo para el backend PostgreSQL sin tratar de manejar la transacción para usted. Si no hace uso de BEGIN / COMMIT / ROLLBACK entonces cada .execute () se ejecuta y se comprometió de inmediato. Usted puede hacer su propia gestión de transacciones mediante la emisión de BEGIN / COMMIT comandos / ROLLBACK. Obviamente en el modo de confirmación automática no se puede llamar conn.commit () o conn.rollback () porque psycopg no es hacer el seguimiento de las transacciones, pero sólo el envío de cualquier cosa que .Execute () directamente al servidor.

En el ejemplo A y B se comprometería, C y D se pueden revertir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top