Ich versuche einige Befehle in einer Transaktion mit Npgsql 2.1.3 (Postgres v9.3) und Dapper 1.29 auszuführen, bekomme aber gelegentlich einige unerwartete Ausnahmen. Manchmal funktioniert der Code einwandfrei. Andere Male bekomme ich die folgende Ausnahme:
Npgsql.NpgsqlException : ERROR: 57014: canceling statement due to user request
Meine Verbindungszeichenfolge ist (Ich habe die Benutzer-ID, das Kennwort und die Datenbank entfernt):
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
Hier ist ein Beispiel für den fehlerhaften Code (ignorieren Sie die Fehlerüberprüfung aus Gründen der Kürze):
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();
}
Weiß jemand, warum der obige Code bei mir unregelmäßig ausfallen würde? Ich habe überprüft, dass keiner meiner Aufrufe von connection.Query <> eine Ausnahme auslöst. Wenn ich vor der transaction.Dispose () einen Thread.Sleep () -Befehl einfüge, tritt die Ausnahme nie auf. Es scheint, dass ein asynchroner Code aufgerufen wird, um die Antwort von Rollback () zu lesen, die nach dem Ablegen der Transaktion erfolgt und somit die Ausnahme auslöst. Ich habe alle Eigenschaften von NpgsqlConnection und NpgsqlTransaction untersucht, und keine von ihnen scheint anzuzeigen, ob das Ergebnis von Rollback () gelesen wurde oder nicht. Ich werde es an meinem Ende weiter untersuchen, aber jede zusätzliche Hilfe wird sehr geschätzt.
Für alle anderen, bei denen dieses Problem auftritt: Das Update auf Npgsql 2. 2 .3 (ab 2. 1 .3) behebt das Problem. Ich habe keine Fixes in den Npgsql Release Notes gesehen, die anscheinend verwandt sind, aber es hat sich eindeutig etwas geändert, das den Fehler behoben hat.