Pregunta

Actualmente estoy agregando pruebas unitarias a una cantidad bastante grande de procedimientos almacenados PostgreSQL, utilizando PGTAP.

Algunos de los procedimientos realizan operaciones que bloquean las filas explícitamente. Estas cerraduras son críticas para la aplicación.

¿Cómo escribo pruebas que verifican que las filas que necesitan ser bloqueadas han sido y que las filas que no deberían estar bloqueadas no lo son?

La única "pista" que tengo en este momento es la extensión de Pgrowlocks, que permite que una transacción verifique las filas bloqueadas por otra transacción. Sin embargo, la transacción actual no parece ver sus propias cerraduras, por lo que tendría que usar algo para sincronizar dos transacciones, y a menos que esté bastante equivocado, no hay forma de hacerlo usando PGTAP.

(Nota: Uso de PostgreSQL 9.1)

¿Fue útil?

Solución

Si puede identificar el CTID de las filas en cuestión y saber qué transacción debería tener las filas bloqueadas, ¿tal vez podría usar la extensión de PageInspect y mirar los indicadores de información de la tupla y Xmax? Los indicadores de información deben indicar que la fila está bloqueada y XMAX se establece en la ID de transacción que lo mantiene.

Otros consejos

¿Cómo escribo pruebas que verifican que las filas que necesitan ser bloqueadas han sido y que las filas que no deberían estar bloqueadas no lo son?

Abra la transacción separada, intente bloquear la misma fila con Nowait y atrapar la excepción.

PostgreSQL no tiene soporte para transacciones autónomas, por lo tanto, para abrir una transacción separada desde la prueba PGTAP, tendrá que recurrir a dblink u otra extensión similar.

PD. Encontré este enlace, donde Robert Haas explica, por qué las tuplas de nivel de fila no se rastrean en PG_LOCKS:

(...) Se presentan cerraduras de tupla inseguras en PG_LOCKS, pero desaparecen una vez otorgadas. (PostgreSQL se quedaría sin espacio en la mesa de bloqueo incluso en una selección de tamaño mediano para consulta de actualización si no hiciéramos esto).

Por otro lado, no entiendo por qué quiere probar la existencia de bloqueo, está garantizado después del exitoso comando de bloqueo.

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