VisualBasic Transaktionen

Nossi

Captain
Registriert
Okt. 2002
Beiträge
3.893
Wenn man der MSDN, den 500.000 ersten Googleeinträgen, diversen Foren, Tutorials und Büchern glauben schenken mag, dann sind Transaktionen die einfachste Sache der Welt. Daher werde ich langsam ein wenig ärgerlich, dass so gut wie jeder für eine Transaktion nicht mehr wie 10 Zeilen schreiben muss, nur bei mir scheint dies auf Teufel komm raus nicht zu klappen.

Code:
If Left(LCase(lquery), 6) = "delete" Or _
Left(LCase(lquery), 6) = "update" Or Left(LCase(lquery), 6) = "insert" Then
' Bei Insert, Update und Delete wird eine Transaktion gestartet
        Transaction = True

        gConnection.BeginTrans
        gConnection.Execute lquery
        
        If MsgBox("Änderungen übernehmen?", vbYesNo) = vbYes Then
           gConnection.CommitTrans
        Else
           gConnection.RollbackTrans
        End If
    
Else
        ' Bei select wird eine herkömmliche Abfrage gestartet
         Transaction = False
         rsQuery.Open lquery, gConnection

End If

lquery ist hierbei sowas wie "delete from tabelle where name = 'test'".

Das Problem ist folgenermaßen:
Er ignoriert den Rollback. Ich bekomme keine Fehlermeldung, er aktzeptiert jede Zeile Code die dort steht, er geht, wenn ich bei der msgbox auf "Nein" klicke brav in den dafür vorgesehenen Zweig mit gConnection.rollbacktrans hinein - er führt die ganze Geschichte aber trotzdem aus.

Wenn also jemand weiß warum der Kram nicht funktioniert wäre ich ihm echt dankbar, ich bin langsam ein klein wenig genervt...
Ergänzung ()

Ok, ich habs jetzt...

Ich habe ursprünglich als Provider im Quellcode MSDASQL ausgewählt. Da ich hier aber an einer Sybase Datenbank arbeite hat ein einfaches wechseln auf ASAprov das Problem gelöst.
 
Ich glaube du hast den Sinn von Transaktionen nicht ganz verstanden:D

1.) Wenn du den User fragen willst, ob er das wirklich tun will, dann mach das bitte VORHER

2.) Ein einzelnes Statement werden die meisten Datenbanksysteme immer als eine einzelne Transaktion ausführen. Transaktionen zu verwenden macht nur Sinn, wenn du mehrere Statements hintereinander ausführen willst z.B. den Wert von einem Bankkonto wegzählen und dann auf dem anderen dazuzählen. Die Logik dahinter muss immer das Programm entscheidung und kann nicht einfach vom Typ des Statements abhängig gemacht werden.

3.) Bitte unterscheide den Typ eines Statements nich durch seinen Anfang. Das kann ordentlich ins Auge gehen, wenn du auf einmal so Dinge wie ein select into bekommst, von create table etc. will ich einmal gar nicht reden. Gerade wenn man mit Transaktionen arbeitet, muss man extrem sauber arbeiten, da Fehler nicht unbedingt immer reproduzierbar sein müssen (Deadlocks etc.)
 
Zurück
Oben