Home > Artikel > Ausgabe 3/2017 > Transaktionen in Access

Transaktionen in Access

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wenn Sie Datenbankaktionen per Code ausführen, also beispielsweise mit der Methode Execute des Database-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und ändern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausführen wollen, die nur dann ausgeführt werden sollen, wenn die Ausführung jeder einzelnen Aktion erfolgreich ist? Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext über eine oder mehrere Datenbankänderungen, der nach dem Ausführung aller Änderungen entweder komplett abgeschlossen oder verworfen werden kann.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1703_Transaktionen.accdb.

Möglichkeiten der Änderung von Daten

Unter DAO gibt es verschiedene Möglichkeiten, per Code Daten zu ändern. Die erste Variante nutzt etwa die AddNew-Methode, um einen neuen Datensatz zu einem Recordset hinzuzufügen und schließt den Vorgang nach dem Festlegen der Feldinhalte mit der Update-Methode ab:

Public Sub Datenaenderungen()

Dim db As DAO.Database

Dim rst As DAO.Recordset

Set db = CurrentDb

Set rst = db.OpenRecordset("tblKategorien", dbOpenDynaset)

rst.AddNew

rst!Kategoriename = "Neue Kategorie"

rst.Update

End Sub

Hier gibt es keine offenen Fragen: Wenn keine Fehlermeldung erscheint, speichert die Prozedur den Datensatz wie gewünscht in der Datenbank. Ein Fehler tritt beispielsweise auf, wenn Sie zwei Mal den gleichen Wert für das Feld Kategoriename in der Datenbank speichern und den eindeutigen Index für dieses Feld verletzen. In diese Fall wird der Datensatz dann einfach nicht gespeichert.

Etwas anders sieht es aus, wenn Sie die Aufgaben mit der Execute-Methode ausführen und dazu eine entsprechende SQL-Abfrage formulieren. Ein ganz einfaches Beispiel sieht wie folgt aus:

Public Sub NeuerDatensatzExecute()

Dim db As DAO.Database

Set db = CurrentDb

db.Execute "INSERT INTO tblKategorien (Kategoriename) VALUES('Noch eine Kategorie')"

End Sub

Auch hier gilt: Der Datensatz wird entweder eingetragen oder auch nicht. Über letzteres werden wir allerdings nicht informiert, denn wir haben den Wert dbFailOnError für den zweiten Parameter der Execute-Methode vergessen. Erst damit setzt es eine Fehlermeldung, wenn Sie beispielsweise versuchen, den gleichen Kategorienamen zwei Mal hintereinander einzufügen (siehe Bild 1).

Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens

Bild 1: Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens

Probleme mit mehreren betroffenen Datensätzen

Nun schauen wir uns an, was passiert, wenn wir mit einer Aktionsabfrage gleich mehrere Datensätze ändern wollen – beispielsweise, indem wir versuchen, alle Einzelpreise in der Tabelle tblArtikel um 10 EUR zu senken:

Public Sub MehrereDatensaetze()

Dim db As DAO.Database

Set db = CurrentDb

db.Execute "UPDATE tblArtikel SET Einzelpreis = Einzelpreis - 10"

Debug.Print "Betroffene Datensätze: " _

& db.RecordsAffected

End Sub

Wir verwenden bewusst noch einmal die Variante der Execute-Methode ohnen den Wert dbFailOnError. Was geschieht? Es wird natürlich keine Fehlermeldung ausgelöst und wir erhalten im Direktfenster die folgende Ausgabe:

Betroffene Datensätze: 38

Das heißt, dass von den 77 Datensätzen dieser Tabelle nur 38 geändert wurden. Bei den übrigen hat die Gültigkeitsregel gegriffen, die besagt, dass nur Werte größer oder gleich 0 in das Feld eingegeben werden dürfen. Welche Erkenntnis ziehen wir daraus? Aktionsabfragen, die sich auf mehrere Datensätze beziehen, werden unter Umständen nicht komplett ausgeführt.

Fügen wir dem Aufruf der Execute-Methode hingegen wieder den Wert dbFailOnError als zweiten Parameter hinzu, wird die Abfrage insgesamt nicht ausgeführt, sondern die Gültigkeitsmeldung erscheint (siehe Bild 2):

Fehlermeldung bei Verletzung der Gültigkeitsregel bei mindestem einem der betroffenen Datensätze

Bild 2: Fehlermeldung bei Verletzung der Gültigkeitsregel bei mindestem einem der betroffenen Datensätze

db.Execute "UPDATE tblArtikel SET Einzelpreis = Einzelpreis - 10", dbFailOnError

Wenn Sie eine solche Abfrage über die Benutzeroberfläche über den Abfrageentwurf formulieren und starten, erhalten Sie eine Fehlermeldung wie in Bild 3. Hier erhalten Sie zwar keine genaue Angabe, warum die Daten nicht aktualisiert werden können, aber immerhin haben Sie die Möglichkeit, die Aktualisierung abzubrechen.

Fehlermeldung, wenn nicht alle Daten geändert werden können

Bild 3: Fehlermeldung, wenn nicht alle Daten geändert werden können

Sie sehen: Datenänderungen, die Sie nicht mit den DAO-Methoden AddNew, Edit und Update durchführen, sondern die Sie als SQL-Abfrage formulieren und mit der Execute-Methode ausführen, sind längst nicht in sich abgeschlossen und werden durchaus auch nur teilweise ausgeführt, wenn ein Teil der Änderungen nicht durchgeführt werden kann.

Hier können Sie auch mit Transaktionen nichts ändern – beim Einsatz der Execute-Methode müssen Sie zwingend mit dem Parameter dbFailOnError arbeiten, um beim Ausführen auftretende Fehler abzufangen.

Transaktionen in gespeicherten Abfragen

Wenn Sie eine Aktionsabfrage im Abfrageentwurf anlegen und diese speichern, können Sie im Eigenschaftsfenster der Abfrage die Eigenschaft Transaktionen verwenden einstellen (siehe Bild 4). Standardmäßig ist diese Option aktiviert. Das bedeutet, dass Access je nach dem Umfang der durchzuführenden Änderung Daten in eine temporäre Datenbank auslagert und wieder einliest. Wenn Sie Transaktionen verwenden auf Nein einstellen, wird keine temporäre Datenbank erstellt, was in der Regel zu einer schnelleren Ausführung beitragen sollte.

Die Eigenschaft Transaktionen verwenden

Bild 4: Die Eigenschaft Transaktionen verwenden

Transaktionen

An dieser Stelle kommen Transaktionen ins Spiel. Eine Transaktion ist prinzipiell ein Rahmen, in dessen Kontext eine oder mehrere Änderungen an den Daten der betroffenen Tabellen durchgeführt werden. Der Ablauf bezüglich der oben beschriebenen Fehlermeldungen ist der Gleiche, als wenn Sie die Anweisungen wie oben durchführen.

Der Unterschied ist: Sie können nach dem Durchführen der Änderungen festlegen, ob diese wirklich in die Tabellen geschrieben werden oder ob sie verworfen werden sollen. Sprich: Sie starten eine Transaktion, führen Änderungen an den Daten der Datenbank durch, prüfen, ob alles nach Ihren Wünschen geändert wurde und führen die Änderungen dann endgültig aus oder verwerfen diese.

Oben haben Sie gesehen, dass Sie eine einfache Aktualisierungsabfrage, die Sie per Execute ausführen, quasi in eine Transaktion umwandeln können, wenn Sie den Fehlerparamter dbFailOnError anhängen. Wenn Sie beispielsweise mehrere Abfragen hintereinander ausführen sollen und diese nur in die Datenbank geschrieben werden sollen, wenn alle erfolgreich waren, benötigen Sie eine echte Transaktion, wie Sie aber auch von Access zur Verfügung gestellt wird.

Beispielanwendungszweck für eine Transaktion

Das klassische Beispiel für eine Transaktion sind Kontobuchungen. Wir gehen von einer einfachen Tabelle aus, die tblKonten heißt und nur die folgenden Felder besitzt: KontoID, Kontinhaber und Saldo. Sie ist wie in Bild 5 aufgebaut.

Tabellen zum Speichern von Salden

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!