2009-10-30 18 views
14

Tengo una sesión (SQLAlchemy) en PostgreSQL, con una transacción activa no confirmada. Acabo de pasar la sesión a algún árbol de llamadas que puede o no haber emitido SQL INSERT/UPDATE/DELETE declaraciones, a través de sqlalchemy.orm o directamente a través de la conexión subyacente.Cómo verificar las operaciones pendientes en una transacción de PostgreSQL

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

He visto personas señalar v$transaction en Oracle para la misma cosa (ver this SO question). Estoy buscando algo similar para usar en PostgreSQL.

Respuesta

0

No, no desde el nivel de base de datos, de verdad. ¿Quizás pueda agregar algún rastreo en el nivel de sqlalchemy para rastrearlo?

Además, ¿cómo se define un no-op? ¿Qué pasa si actualizaste un valor con el mismo valor que tenía antes, es un no-operativo 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.

+0

Una escritura redundante también sería "no operativa", claro, pero no quiero que se detecte (más que el valor). Solo quiero saber si la transacción tiene alguna operación de escritura/eliminación, ineficaz o no. –

2

Considérese la siguiente secuencia de estados:

select txid_current(); 

begin; 

select txid_current(); 

Si el ID de transacción devuelto por los dos selecciona es igual, entonces hay una transacción abierta. Si no, entonces no había, (pero ahora es).

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

ACTUALIZACIÓN: De hecho, como señala @ r2evans (gracias por la comprensión!), No es necesario el "comenzar" - txid_current() devuelve el mismo número solo si se encuentra en una transacción .

+0

Quizás no necesite el 'begin': si tiene dos consultas consecutivas de' select txid_current(); ', si devuelven el mismo número que el que tiene actualmente en una transacción. – r2evans

Cuestiones relacionadas