2015-09-02 10 views
11

Nie mogę się zbytnio sprecyzować, ale myślę, że to, co powiem, wystarczy, aby to zrozumieć. Najpierw używam gorp, aby skonfigurować i uzyskać transakcję. Używam sterownika github.com/denisenkom/go-mssqldb.Transakcja sql/db nie jest poprawnie rozwijana z ms sql

Następnie przechodzę serię operacji, a jeśli z nich się nie uda, to I rollback i jeśli wszystkie mają sukces I commit. Problem polega na tym, że wycofuje się tylko stwierdzenie, które się nie powiodło, a nie pozostałe operacje. Czy nie mam racji, że tak nie jest, jak to działa?

Oto szorstki psudocode dać lepsze wyobrażenie o tym, co ja mówię:

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() 

mylę, że powinien rollback wszystko od dbmap.Begin()? Czy jest to błąd w implementacji sterownika? Każda pomoc jest WSPANIAŁA mile widziane. Dzięki!

Aktualizacja

Testowany https://play.golang.org/p/0L3Vgk8C_F i to działało tak Zgaduję, to znaczy, że coś z gorp. Używam gałęzi v1, ponieważ będzie to wkrótce produkcja, więc stabilność jest kluczowa. Przejdę przez to, ale wygląda na to, że po prostu go zawijam.

+3

Próbowałaś patrząc w ślad używając profilera SQL z pakietu narzędzi zarządzania SQL? Sprawdziłbym, czy oczekiwane komendy są rzeczywiście wysyłane przez przewód. – kostix

+1

Następną rzeczą do sprawdzenia jest sprawdzenie, czy tryb automatycznego zatwierdzania nie jest w jakiś sposób włączony, ponieważ w przeciwnym przypadku każde wysyłane polecenie jest zasadniczo oddzielną transakcją. – kostix

+2

Brakuje kluczowej informacji: czego używasz jako sterownika? 'gorp' IUUC jest programem odwzorowującym, a nie warstwą dostępu. – kostix

Odpowiedz

2

Sprawdź, czy nie masz włączonej autocomit. Wiele narzędzi wiersza poleceń, UIS i nawet kierowcy włączyć domyślnie

+0

To sprawia, że ​​TON ma sens, ale nie mogę znaleźć cokolwiek na temat autocommit w jednym z zaangażowanych projektów: https://github.com/go-gorp/gorp/tree/v1 dla mojego opakowania i https://github.com/denisenkom/go-mssqldb dla samego sterownika. Czy istnieje inny termin, który mogliby nazwać? Szukałem też zatwierdzenia, ale nic z tego nie doprowadziło do niczego. Dzięki! –

0

Zgodnie z tym (czytałem tylko kilka linijek) https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx

AUTOCOMMIT wydaje się być przez defauly, że prowadzi mnie do wniosku, że gdyby autora programu go-mssqldb nie zaimplementował on/off dla tej funkcji.

Można ustawić go sobie po prostu szukać IMPLICIT_TRANSACTIONS SET

+0

"Połączenie z wystąpieniem aparatu bazy danych działa w trybie automatycznego zatwierdzania, dopóki instrukcja BEGIN TRANSACTION nie rozpocznie jawnej transakcji lub niejawna transakcja jest włączona.Kiedy transakcja jawna zostanie zatwierdzona lub wycofana, lub gdy tryb transakcji niejawnych zostanie wyłączony, połączenie powróci do trybu automatycznego zatwierdzania. "Dobra myśl, ale to sprawia, że ​​myślę, że to nie to. :-( –