Ipgsql imprevisible Excepción durante la eliminación de la transacción

c# dapper npgsql postgresql-9.3 transactions

Pregunta

Estoy intentando ejecutar algunos comandos en una transacción usando Npgsql 2.1.3 (Postgres v9.3) y Dapper 1.29, pero ocasionalmente recibo algunas excepciones inesperadas. A veces, el código funciona bien. Otras veces, recibo la siguiente excepción:

Npgsql.NpgsqlException : ERROR: 57014: canceling statement due to user request

Mi cadena de conexión es (he eliminado el ID de usuario, la contraseña y la base de datos):

PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;
COMPATIBLE=2.1.3.0;HOST=127.0.0.1;USER ID=...;PASSWORD=...;DATABASE=...;SSLMODE=Require

Aquí hay un ejemplo del código que está fallando (ignorando la comprobación de errores por brevedad):

var connection = new NpgsqlConnection(connectionString);
if (connection.State != ConnectionState.Open)
    connection.Open();
IDbTransaction transaction = connection.BeginTransaction(
    IsolationLevel.RepeatableRead);
try {
    ...
    // Select some stuff using the connection underlying the transaction
    var query = "SELECT * FROM ...";
    var result = connection.Query<MyType>(query, dynamicParams, transaction).ToList();
    ...
    // Perform an insert using the same command indicated above
    query = "INSERT INTO ... (...) VALUES (...) RETURNING *";
    var result2 = connection.Query<MyType2>(query, dynamicParams, transaction).FirstOrDefault();
    ...
    // Delete the entry added above
    query = "DELETE FROM ... WHERE id = :id";
    var result3 = connection.Query<long>(query, dynamicParams, transaction).FirstOrDefault();
    // I Don't explicitly call transaction.Rollback(),
    //     but I have tried that and it has no effect on the outcome
} finally {
    // Note that if I put Thread.Sleep(1000) here, I never get the exception
    transaction.Dispose(); // Npgsql.NpgsqlException (sometimes)
    connection.Dispose();
}

¿Alguien sabe por qué el código anterior estaría fallando erráticamente en mí? He verificado que ninguna de mis llamadas a connection.Query <> arroja una excepción. Además, cuando pongo un comando Thread.Sleep () antes de transaction.Dispose (), la excepción nunca ocurre. Parece que se está llamando a un código asíncrono para leer la respuesta de Rollback (), que está sucediendo después de que se está desechando la transacción y arrojando la excepción. He examinado todas las propiedades de NpgsqlConnection y NpgsqlTransaction, y ninguna de ellas parece indicar si se ha leído o no el resultado de Rollback (). Continuaré investigando por mi parte, pero cualquier ayuda adicional es muy apreciada.

Respuesta aceptada

Para cualquier otra persona que experimente este problema: actualizar a Npgsql 2. 2 .3 (de 2. 1 .3) soluciona el problema. No vi ninguna corrección en las notas de la versión de Npgsql que parecen estar relacionadas, pero es evidente que algo cambió y solucionó el problema.



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é