Hallo zusammen
ich prüfe gerade meinen Code auf korrekte Fehlerhandhabung, vor allem im Falle einer broken connection zur Datenbank im laufenden Betrieb. Dabei ist mir folgendes aufgefallen bzw. folgende Frage aufgekommen:
Mein Code sieht so aus:
lock (this) {
try {
connection = _GetConnection();
connection.Open();
transaction = connection.BeginTransaction();
command = new NpgsqlCommand(procedureName, connection);
command.CommandType = CommandType.StoredProcedure;
//hier bricht Verbindung ab....
object resultDB = command.ExecuteScalar();
transaction.Commit();
result = Convert.ToBoolean(resultDB);
} catch (Exception exception) {
if (transaction != null && connection != null) {
transaction.Rollback();
}
if (IsExceptionConnectionFailure(exception.Message) || transaction == null) {
_ResetConnection(connection);
}
EvaluateAndRelayException(exception);
} finally {
Monitor.PulseAll(this);
connection.Close();
}
}
Ich versuche jetzt verschiedene Fehlerfälle heraufzubeschwören. Unter anderem den Fall, dass die Connection besteht und geöffnet werden kann, allerdings abbricht bevor command.ExecuteScalar() ausgeführt werden kann. Da dann die transaction noch nicht committed war muss sie auch nicht zurückgerollt werden oder? Gibt es eine Möglichkeit aus der transaction einen state oder sowas abzuleiten um herauszufinden dass sie schon committed hat? Oder aus dem command? Ich habe leider nichts gefunden was mir irgendwie sagen könnte in welchem Zustand sich die transaction befindet um sie explizit zurückrollen zu können. Wenn ich sie nämlich versuche zurückzurollen wenn sie noch gar nicht committed ist bekomme ich nachher bei transaction.Rollback() eine Fehlermeldung von NpgSQL.
Freue mich über Rückmeldungen und Tipps.