2015-09-02 5 views
11

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.

+3

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

+1

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

+2

Und ein entscheidendes bisschen Information fehlt: Was benutzen Sie als Treiber? 'gorp' IUUC ist ein Mapper, keine Zugriffsebene. – kostix

Antwort

2

Überprüfen Sie, ob Autocommit aktiviert ist. Viele Kommandozeilen-Tools, UIS und sogar Treiber ermöglichen es standardmäßig

+0

Das macht eine TON von Sinn, aber ich kann nicht Finden Sie in jedem der beteiligten Projekte etwas über Autocommit: https://github.com/go-gorp/gorp/tree/v1 für meinen Wrapper und https://github.com/denisenkom/go-mssqldb für den Treiber selbst. Gibt es einen anderen Begriff, den sie vielleicht nennen? Ich habe auch nur nach einem Commit gesucht, aber nichts davon hat auch zu etwas geführt. Vielen Dank! –

0

dies nach (ich nur ein paar Zeilen lesen) https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx

autocommit scheint durch defauly ON zu sein, die mich zu dem Schluss führt, dass, wenn der Autor von go-mssqldb implementiert nicht ein/aus für dieses Feature seine ON.

Sie können es wechseln sich die Suche nur für SET IMPLICIT_TRANSACTIONS

+0

"Eine Verbindung zu einer Instanz von Database Engine wird im Autocommit-Modus ausgeführt, bis eine BEGIN TRANSACTION-Anweisung eine explizite Transaktion startet oder eine implizite Transaktion aktiviert wird.Wenn die explizite Transaktion festgeschrieben oder zurückgesetzt wird oder wenn der implizite Transaktionsmodus deaktiviert wird, kehrt die Verbindung zum Autocommit-Modus zurück. "Gute Gedanken, aber das lässt mich denken, das ist es nicht. :-( –