Transaktionen

„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.