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.
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
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
Brakuje kluczowej informacji: czego używasz jako sterownika? 'gorp' IUUC jest programem odwzorowującym, a nie warstwą dostępu. – kostix