So kann ich nicht zu spezifisch werden, aber ich denke, was ich Ihnen sagen kann, wird genug sein, um dies herauszufinden. Zuerst benutze ich gorp, um Dinge einzurichten und die Transaktion zu bekommen. Ich verwende den github.com/denisenkom/go-mssqldb
Treiber.sql/db Transaktion nicht korrekt zurückrollen mit ms sql
Dann laufe ich durch eine Reihe von Operationen und wenn von ihnen scheitert ich rollback
und wenn alle Erfolg I commit
haben. Das Problem besteht darin, dass nur die fehlgeschlagene Anweisung zurückgesetzt wird und nicht die restlichen Operationen. Habe ich Unrecht, dass das nicht funktioniert?
Hier einige grobe psudocode Sie eine bessere Vorstellung davon zu geben, was ich rede:
trans,err := dbmap.Begin()
//assume all errors are received and checked before continuing
id := trans.Exec("insert thing") //successful, persists after rollback
thing := trans.Select("Select thing") //successful
trans.Exec("update other_thing with thing") //successful, persists after rollback
newthing := trans.Exec("insert new_thing with thing") //fails, rollsback
if err != nil{
trans.Rollback() //No errors
return
}
trans.Commit()
Bin ich falsch, dass das sollte rollback
alles da dbmap.Begin()
? Ist das ein Fehler in der Treiberimplementierung? Jede Hilfe ist herzlich willkommen. Vielen Dank!
aktualisieren
Getestet https://play.golang.org/p/0L3Vgk8C_F und es funktionierte so etwas das bedeutet, es ich vermute, mit Gorp zu tun. Ich benutze die v1-Filiale, da dies bald produziert werden wird und Stabilität der Schlüssel ist. Ich werde es durchforsten, aber es sieht so aus, als ob es es nur leicht wickelt.
Sie auf der Spur suchen versuchen Haben die SQL Profiler aus der Suite-Tools SQL-Management mit? Ich würde prüfen, ob die erwarteten Befehle wirklich über die Leitung gesendet werden. – kostix
Die nächste Sache zu überprüfen ist zu überprüfen, dass der Autocommit-Modus nicht irgendwie aktiviert wird, da sonst jeder einzelne Befehl, den Sie senden, im Wesentlichen in einer separaten Transaktion ist. – kostix
Und ein entscheidendes bisschen Information fehlt: Was benutzen Sie als Treiber? 'gorp' IUUC ist ein Mapper, keine Zugriffsebene. – kostix