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