' tb-screen: 80x25
' tb-tempdir
' ISAM (Spec isam-datenbank, Anforderung "Transaktionen mit Ruecknahme"):
' BEGINTRANS/COMMITTRANS schreibt fest, ROLLBACK ALL stellt Saetze und
' Indizes wieder her und beendet die Transaktion, SAVEPOINT liefert eine
' Kennung und ROLLBACK kennung setzt nur bis dorthin zurueck.
' Laeuft in einem temporaeren Verzeichnis.
TYPE Posten
    Nr AS INTEGER
    Text AS STRING * 6
END TYPE
DIM p AS Posten

ON ERROR GOTO Handler
OPEN "buch.isam" FOR ISAM Posten "Posten" AS #1
CREATEINDEX #1, "NachNr", 1, "Nr"
SETINDEX #1, "NachNr"

' --- 8.1: COMMITTRANS schreibt fest; nach erneutem Oeffnen ist alles da ---
BEGINTRANS
p.Nr = 1
p.Text = "eins"
INSERT #1, p
p.Nr = 2
p.Text = "zwei"
INSERT #1, p
COMMITTRANS
CLOSE #1
OPEN "buch.isam" FOR ISAM Posten "Posten" AS #1
SETINDEX #1, "NachNr"
PRINT "nach COMMITTRANS:";
GOSUB Durchlauf

' --- 8.3: ROLLBACK ALL nimmt Einfuegen und Loeschen zurueck ---
BEGINTRANS
p.Nr = 3
p.Text = "drei"
INSERT #1, p
SEEKEQ #1, 1
DELETE #1
PRINT "in der Transaktion:";
GOSUB Durchlauf
ROLLBACK ALL
PRINT "nach ROLLBACK ALL:";
GOSUB Durchlauf
' Die Transaktion ist beendet — ein weiteres ROLLBACK ist unzulaessig.
ROLLBACK ALL

' --- 8.4: SAVEPOINT und ROLLBACK kennung ---
BEGINTRANS
p.Nr = 4
p.Text = "vier"
INSERT #1, p
s% = SAVEPOINT
PRINT "Sicherungspunkt:"; s%
p.Nr = 5
p.Text = "fuenf"
INSERT #1, p
p.Nr = 6
p.Text = "sechs"
INSERT #1, p
PRINT "vor ROLLBACK:";
GOSUB Durchlauf
ROLLBACK s%
PRINT "nach ROLLBACK s:";
GOSUB Durchlauf
' Die Transaktion laeuft weiter und laesst sich festschreiben.
COMMITTRANS
PRINT "nach COMMITTRANS:";
GOSUB Durchlauf

CLOSE #1
PRINT "fertig"
END

Durchlauf:
MOVEFIRST #1
DO WHILE NOT EOF(1)
    RETRIEVE #1, p
    PRINT " "; RTRIM$(p.Text);
    MOVENEXT #1
LOOP
PRINT
RETURN

Handler:
PRINT "ERR="; ERR
RESUME NEXT
