Pregunta

Tengo una sesión (SQLAlchemy) en PostgreSQL, con una transacción activa no comprometida. Acabo de pasar la sesión a un árbol de llamadas que puede o no haber emitido instrucciones SQL INSERT / UPDATE / DELETE , a través de sqlalchemy.orm o directamente a través de la conexión subyacente.

¿Hay alguna manera de verificar si hay alguna declaración pendiente de modificación de datos en esta transacción? Es decir. si commit sería un no-op o no, y si rollback descartaría algo o no?

He visto a personas señalar v $ transacción en Oracle por lo mismo (ver esta pregunta SO ). Estoy buscando algo similar para usar en PostgreSQL.

¿Fue útil?

Solución

Comience por acceder a la vista del sistema pg_locks.

http://www.postgresql.org/docs/ 8.4 / interactive / view-pg-locks.html

Otros consejos

Considere la siguiente secuencia de declaraciones:

select txid_current();

begin;

select txid_current();

Si la identificación de la transacción devuelta por las dos selecciones es igual, entonces hay una transacción abierta. Si no, entonces no la hubo, (pero ahora sí).

Si los números son diferentes, entonces, como efecto secundario, simplemente habrá abierto una transacción, que probablemente querrá cerrar.

ACTUALIZACIÓN : De hecho, como señala @ r2evans (¡gracias por la información!), no necesita el " comenzar " - txid_current () devolverá el mismo número solo si está en una transacción.

No, en realidad no desde el nivel de la base de datos. ¿Quizás pueda agregar algo de rastreo en el nivel de sqlalchemy para rastrearlo?

Además, ¿cómo se define un no-op? ¿Qué pasa si actualizaste un valor al mismo valor que tenía antes, es un no-op o no? Desde la perspectiva de las bases de datos, si tuviera una, no sería un no-op. Pero desde la perspectiva de la aplicación, probablemente lo haría.

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