„Transaktion“ ist ein Begriff aus der Wirtschaftswelt. Darunter versteht man den Austausch von Gütern oder Informationen in zwei Richtungen. Für die Informatik bedeutet eine Transaktion ganz ähnlich, dass zwei oder mehr Operationen nur entweder gemeinsam oder gar nicht ausgeführt werden dürfen. Wenn wir beispielsweise Geld überweisen, wäre es fatal, wenn es auf dem einem Konto belastet, aber nicht dem anderen Konto gutgeschrieben werden würde.
Mit VBA ist es auch in Access möglich, mehrere
Aktionsabfragen zu Transaktionen
zusammenzufassen, so dass entweder alle ausgeführt werden oder keine. Eine
Transaktion ist wahlweise mit Workspace
oder DBEngine
möglich und wird mit der BeginTrans
-Methode eingeleitet. Nachfolgende
Aktionsabfragen gehören zu der Transaktion, bis sie mit CommitTrans
abgeschlossen oder Rollback
abgebrochen wird.
Die folgende Prozedur zeigt eine typische Verwendung für eine Transaktion: Es
werden mehrere Aktionsabfragen mit der Option dbFailOnError
ausgeführt.
Sollte eine der Aktionsabfragen nicht alle Datensätze anfügen können, verursacht
sie somit einen Fehler. Die Fehlerbehandlungsroutine verwirft dann alle Änderungen
innerhalb der Transaktion. Wird der Fehler also beispielsweise erst in der Abfrage
ZählerHochsetzen
verursacht, werden auch die Änderungen verworfen,
die durch die vorhergehenden Abfragen eigentlich schon fehlerfrei durchgeführt
wurden.
Public Sub Transaktion() Dim db As DAO.Database Set db = CurrentDb On Error GoTo FEHLER_Transaktion DBEngine.BeginTrans db.Execute "GeldAbbuchen", dbFailOnError db.Execute "GeldGutschreiben", dbFailOnError db.Execute "ZählerHochsetzen", dbFailOnError DBEngine.CommitTrans MsgBox "Die Transaktion war erfolgreich!", vbInformation Set db = Nothing Exit Sub FEHLER_Transaktion: DBEngine.Rollback MsgBox "Die Transaktion war NICHT erfolgreich!", vbCritical End Sub
Im folgenden Beispiel werden verschiedene Umsätze gebucht, die auch eine Bargeldkasse betreffen können. Logischerweise kann in einer Kasse entweder Geld vorhanden sein oder sie ist leer - ein negativer Kassenbestand ist jedoch völlig ausgeschlossen. Wurde bei der Dateneingabe einen Fehler gemacht, der zu einem negativen Kassenbestand führen würde, kann der Fehler erst nach der Buchung sichtbar werden. Daher wird nach der Buchung der Kassenbestand geprüft, und bei einem negativen Kassenbestand die Änderungen verworfen.
Public Sub Buchen() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb DBEngine.BeginTrans 'Erst buchen ... db.Execute "qryUmsätzeBuchen" '... dann prüfen Set rs = db.OpenRecordset("SELECT Sum(Betrag) AS Kassenbestand FROM tblKasse;") If rs("Kassenbestand") < 0 Then DBEngine.Rollback MsgBox "Vorgang abgebrochen: Negativer Kassenbestand nicht erlaubt!" Else DBEngine.CommitTrans End If Set db = Nothing Set rs = Nothing End Sub
In den obigen Beispielen befinden sich auch Messageboxen. Es ist Absicht, dass sie stets erst nach Abschluss der Transaktion vorkommen. Solange eine Transaktion nicht abgeschlossen ist, sind nämlich die zugehörigen Datensätze gesperrt. Das kann nicht nur in einer Mehrbenutzungsumgebung kritisch werden. Transaktionen sollten stets so rasch als möglich wieder beendet werden.