Korrekte Handhabung von broken connections

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.

Wenn die Abfrage:

select count(*) 
from pg_locks 
where pid = pg_backend_pid() 
  and locktype in ('transactionid') 
  and mode = 'ExclusiveLock'

einen Wert > 0 zurück liefert, dann gibt es noch Änderungen die noch nicht comitted wurden.

Vielen Dank für die schnelle Antwort. Die Abfrage liefert mir allerdings immer 0. Im Endeffekt habe ich ja bisher auch noch nichts gemacht außer dass ich connection.BeginTransaction aufgerufen habe. Außerdem habe ich ja das Problem, wenn die Verbindung abgebrochen ist, dass ich dann sowieso nicht mehr auf die Datenbank zugreifen kann von meinem C#-Client aus. Daher meine Frage ob ich aus den bestehenden Instanzen transaction, connection vielleicht ein flag oder irgendwas auslesen kann dass mir Aufschluss gibt in welchem Zustand sich die transaction befindet.

Da sich das komplett in Deinem Code abspielt hat das nichts mit Postgres zu tun, sondern nur mit C# (?)

Hmm, in gewisser Weise ja. Ich habe ja mit connection.BeginTransaction() bereits etwas angestoßen. Daher dachte ich dass vielleicht in den C# Instanzen von connection oder transaction etwas auszulesen wäre in welchem Zustand sie sind. Aber in der Doku habe ich so nichts gefunden. Aber kann gut sein dass es da keine Möglichkeit gibt etwas herauszufinden.