Transaktionen in Access

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Die Durchführung von Aktualisierungen am Datenbestand wird umso fehleranfälliger, je mehr Schritten die jeweilige Aktion beinhaltet und je mehr Personen gleichzeitig auf den betroffenen Datenbestand oder Teilmengen davon zugreifen können. Transaktionen sind eine Technik, die in beiden Fällen für Sicherheit sorgen und Inkonsistenzen vermeinden helfen.

Wofür Transaktionen

Stellen Sie sich das einfache Beispiel einer Bank vor, in der ein Mitarbeiter einen Betrag von beispielsweise 100 Euro von einem Konto auf ein anderes umbucht. Dazu sind zwei Schritte erforderlich: Man muss dem ersten Konto die 100 Euro abziehen und diese dem zweiten Konto zuschreiben. Diese beiden Vorgänge müssen untrennbar miteinander verbunden sein; die Durchführung nur eines der Vorgänge würde zu einer Inkonsistenz führen. Entweder gibt es dann in der Gesamtbilanz irgendwo 100 Euro zuviel oder zuwenig – je nachdem, welcher Vorgang schiefgelaufen ist.

Also benötigt man eine Technik, die mehrere Vorgänge “sammelt” und entscheidet, ob die betreffenden änderungen durchzuführen sind oder verworfen werden.

Im Datenbankbereich lassen sich Operationen als Transaktion zusammenfassen. Mit einer bestimmten Anweisung legt man fest, wann die Transaktion beginnt. Sind alle zusammenhängenden Aktionen erledigt, beendet man die Transaktion mit einer weiteren Anweisung. Erst dann wirken sich die durchgeführten änderungen auf den Datenbestand aus. Es gibt noch eine weitere Möglichkeit, eine Transaktion zu beenden: Wenn nicht alle enthaltenen Aktionen erfolgreich durchgeführt werden konnten, bricht man die Transaktion ab. In dem Fall werden alle der bis dahin durchgeführten änderungen am Datenbestand verworfen.

Transaktionen in der Praxis

Das obige Beispiel setzt voraus, dass theoretisch die Möglichkeit besteht, dass eine der innerhalb der Transaktion durchgeführten Aktionen scheitern könnte – das kann durchaus passieren, wenn etwa das Konto, von dem der Betrag abgebucht werden soll, nicht die notwendige Deckung aufweist. Kann man nicht einfach vor dem Durchführen der beiden Vorgänge prüfen, ob die Voraussetzungen erfüllt sind und erst dann die entsprechenden Aktionen durchführen

Die Antwort lautet Jein. Wenn es sich bei dem System um eine Einzelplatzlösung handelt, wie es etwa bei einer Buchhaltungssoftware für Freiberufler der Fall sein dürfte (die sich in der Regel keinen Mitarbeiterstab für die Regelung ihrer Finanzen leisten), können sie locker auf die Verwendung von Transaktionen verzichten.

Wenn es sich aber tatsächlich um eine Software handelt, die in einer Bank oder ähnlichen Institutionen eingesetzt wird, greifen unter Umständen mehrere Leute gleichzeitig auf ein und dasselbe Konto zu. Damit diese Vorgänge sich nicht überlappen, sperrt der erste Vorgang die relevanten Tabellen oder Datensätze und gibt diese erst nach Beendigung der Transaktion wieder frei. Die verwendeten Sperrmechanismen hängen dabei von den aktuell für diese Datenbank festgelegten Einstellungen ab. Wenn Sie optimistische Sperrung anwenden, sperrt eine Transaktion die betroffenen Datensätze erst beim Abschließen der Transaktion; beim pessimistischen Sperren hingegen beginnt die Sperre sofort mit dem Bearbeiten der Daten.

Transaktionen und Aktionsabfragen

Transaktionen können sich auf eine oder mehrere Tabellen beziehen. Bereits eine Aktionsabfrage zum Erhöhen aller Preise in einer Artikel-Tabelle kann Gegenstand einer Transaktion werden, wenn mehrere Datensätze daran beteiligt sind. Sie müssen allerdings bestimmte Regeln beachten, um die in Access eingebauten Transaktionsmechanismen zu nutzen.

Zum Ausführen von Aktionsabfragen gibt es mehrere Möglichkeiten:

  • Ausführen der Abfrage per Menübefehl
  • Aufruf mit DoCmd.RunSQL
  • Aufruf mit CurrentDB.Execute

Die ersten beiden Varianten sind identisch; das DoCmd-Objekt verschafft dem Entwickler lediglich Zugriff auf die Menüelemente per VBA. Zu Beispielzwecken verwenden Sie eine Tabelle, die lediglich die beiden Felder ZahlID und Zahl enthält und unter dem Namen tblZahlen gespeichert ist.

Um Fehler während Transaktionen nachstellen zu können, stellen Sie die Feldgröße des Feldes Zahl auf Integer und die Gültigkeitsregel auf >0 ein – so kann dieses Feld nur positive Zahlen aufnehmen (s. Bild 2 hinzu.

pic001.png

Bild 1: Beispieltabelle tblZahlen

pic002.png

Bild 2: Beispielwerte in der Tabelle tblZahlen

Implizite Transaktion mit Aktionsabfragen und DoCmd.RunSQL

Rufen Sie dann im Direktfenster folgende Aktionsabfrage auf, die von den im Feld Zahl enthaltenen Werten die Zahl 100 subtrahiert:

DoCmd.RunSQL "UPDATE tblZahlen SET Zahl = Zahl - 100"

Mit der beschriebenen Beispielkonfiguration und obiger Anweisung sollten Sie eine Meldung wie in Bild 3 erhalten (zuvor kommt – je nach der Einstellung der Access-Optionen – noch eine Abfrage, ob Sie die Aktionsabfrage überhaupt durchführen möchten).

pic003.png

Bild 3: Bei Fehlern in Aktionsabfragen erscheint eine Meldung.

Die Meldung deutet darauf hin, dass Access zwar schon versucht hat, die Abfrage durchzuführen, aber dies noch nicht getan hat – sonst ließe sich diese nicht einfach rückgängig machen. Mit einem Klick auf Ja führen Sie alle Teile der Abfrage durch, die nicht zu einem Fehler führen, mit einem Klick auf Nein brechen Sie die Transaktion ab. Allerdings lösen Sie damit einen Fehler aus (s. Bild 4), um den Sie sich mit einer entsprechenden Fehlerbehandlung kümmern müssen.

pic004.png

Bild 4: Das Abbrechen einer mit DoCmd.RunSQL gestarteten Aktionsabfrage führt zu einem Fehler.

Keine implizite Transaktion mit der Execute-Methode

In einer professionellen Anwendung möchten Sie den Benutzer möglicherweise nicht mit so einer Meldung konfrontieren. Im besten Fall können Sie vorher abschätzen, welche Probleme beim Durchführen einer Aktionsabfrage auftreten können und legen direkt im Code entsprechende Maßnahmen fest.

Die Execute-Anweisung des Database– oder Connection-Objekts erleichtert dies.

Die in der folgenden Prozedur verwendete Anweisung führt alle in der Aktionsabfrage enthaltenen Teile aus, die keinen Fehler auslösen:

Public Sub Aktionsabfrage()
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "UPDATE tblZahlen SET Zahl = Zahl - 100"
    Set db = Nothing
End Sub

Das bringt Sie auch nicht viel weiter, da der Benutzer nicht erfährt, das nicht alle gewünschten Operationen komplett ausgeführt wurden. Die folgende Variante unterscheidet sich lediglich durch den Parameter dbFailOnError in der Execute-Anweisung von der vorherigen Version:

Public Sub AktionsabfrageMF()
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "UPDATE tblZahlen SET Zahl = Zahl - 100", dbFailOnError
    Set db = Nothing
End Sub

Der Einsatz des Parameters dbFailOnError sorgt dafür, dass Access bei Problemen mit der Aktionsabfrage entsprechende Fehlermeldungen ausgibt, wie das Beispiel aus Bild 5 zeigt.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar