Transaktionen

„Transaktion“ ist ein Begriff aus der Wirtschaftswelt, vor allem dem Bankwesen. Unter einer Transaktion versteht man den Austausch von Gütern oder Informationen in zwei Richtungen. Für die Informatik bedeutet eine Transaktion, 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 abgebucht, aber nicht dem anderen Konto gutgeschrieben werden würde.

Mit VBA ist es auch in Access möglich, mehrere Aktionsabfragen in 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. Darauffolgende Aktionsabfragen gehören zur Transaktion, bis sie mit CommitTrans abgeschlossen oder Rollback abgebrochen wird.

Die folgende Prozedur zeigt eine Transaktion, wie sie häufig zu finden ist: Es werden mehrere Aktionsabfragen mit der Option dbFailOnError ausgeführt. Mit dieser Option verursacht z. B. eine Anfügeabfrage einen Fehler, wenn nicht alle Datensätze angefügt werden können. Die Fehlerbehandlungsroutine verwirft in diesem Fall alle Änderungen der Transaktion. Wird der Fehler also erst in der Abfrage ZählerHochsetzen verursacht, würden auch die Änderungen verworfen werden, die eigentlich schon durch die vorhergehenden Abfragen umgesetzt 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 - es ist aber vollkommen unmöglich, dass es einen negativen Kassenbestand gibt. Hat man bei der Dateneingabe einen Fehler gemacht, der zu einem negativen Kassenbestand führen würde, zeigt sich der Fehler vielleicht erst nach dem Buchen. Daher wird im Beispiel nach dem Buchen 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 ist nicht nur in einer Mehrbenutzungsumgebung kritisch. Transaktionen sollten stets so rasch als möglich wieder beendet werden.