PREPARE / EXECUTE en Npgsql 3.2

dapper npgsql postgresql

Pregunta

Estoy usando Npgsql 3.2 y parece que el controlador ahora está preparando declaraciones automáticamente.

Veo lo siguiente en los registros de PostgreSQL:

LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4)

Puedo estar equivocado, pero esto no está activado en la cadena de conexión y no veo ninguna llamada previa de "preparación" en los registros.

Qué me estoy perdiendo ?

También estoy usando Dapper 1.50.2 en la parte superior de Npgsql para consultar la base de datos. Esto aún no se implementa en este nivel, pero veo que hay algunas conversaciones sobre dicha función en GitHub .

Estoy usando una transacción READ COMMITTED para actualizar una fila en la base de datos. La fila se actualiza dos veces con 2 declaraciones de disctinct.

Al reproducir las instrucciones una por una en una ventana de consulta pgadmin, funciona bien.

Cuando el controlador ejecuta las sentencias a través de execute, la primera instrucción parece poner bloqueos en el registro y la segunda instrucción se cuelga.

Aquí están las consultas ejecutadas en la ventana de consulta (se ejecuta hasta su finalización):

BEGIN;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SELECT * FROM database.update_item(params...);

SELECT * from database.update_item(params...);

ROLLBACK;

Los registros PG correspondientes:

LOG: statement: BEGIN;
LOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
LOG: statement: SELECT * FROM database.update_item(params...);
LOG: statement: SELECT * from database.update_item(params...);
LOG: statement: ROLLBACK;

Los registros de PostgreSQL cuando son reproducidos por Npgsql:

LOG:  statement: BEGIN
LOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG:  execute <unnamed>: select * from database.update_item(params...)
LOG:  execute <unnamed>: select * from database.update_item(params...) <-- hangs

Cualquier ayuda apreciada.

EDIT 1 :

Información adicional: la función update_item () plpgsql está actualizando la fila con una instrucción EXECUTE .

EDICION 2 :

Se agregaron registros de PG para la ventana de consulta.

Respuesta popular

Primero, la característica de preparación automática de Npgsql es opt-in - no se activa sin la cadena de conexión. Incluso entonces, el mismo SQL debe ejecutarse varias veces (5 por defecto) antes de que Npgsql lo prepare. Ver la documentación para más detalles.

En cuanto a su punto muerto, ¿está ejecutando su código al mismo tiempo? En otras palabras, ¿tiene varias transacciones al mismo tiempo, actualizando las mismas filas? Si es así, entonces este es probablemente el comportamiento esperado de PostgreSQL y no tiene nada que ver con Npgsql. Cuando actualiza filas en una transacción, estas filas se bloquean hasta que se confirma la transacción. La solución en general es actualizar las filas en el mismo orden. Vea la documentación de PostgreSQL para más detalles.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué