¿Qué hacer cuando Postgres comenzar es correr en una conexión en modo de confirmación automática?
-
21-09-2019 - |
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?
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.