Quindi non posso essere troppo specifico, ma penso che quello che posso dire sarà sufficiente per capirlo. Per prima cosa sto usando gorp per impostare le cose e ottenere la transazione. Sto usando il driver .sql/db non si ripristina correttamente con ms sql
Quindi eseguo una serie di operazioni e in caso di esito negativo I rollback
e se tutti hanno successo I commit
. Il problema è che è solo il rollback della dichiarazione che ha fallito e non il resto delle operazioni. Ho torto che non è così che dovrebbe funzionare?
Ecco alcune psudocode approssimativa per darvi una migliore idea di cosa sto parlando:
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()
Mi sbaglio che che dovrebbe rollback
tutto dal dbmap.Begin()
? Si tratta di un bug nell'implementazione del driver? Qualsiasi aiuto è GRANDE benvenuto. Grazie!
Aggiornamento
Testato https://play.golang.org/p/0L3Vgk8C_F e ha funzionato in modo da sto indovinando che significa che qualcosa a che fare con gorp. Sto usando il ramo v1 poiché questa sarà presto la produzione e quindi la stabilità è la chiave. Ci passerò sopra, ma sembra che lo stia avvolgendo leggermente.
Hai provato guardando la traccia utilizzando SQL Profiler dalla suite strumenti di gestione di SQL? Verificherei se i comandi previsti sono realmente inviati sul filo. – kostix
La prossima cosa da verificare è verificare che la modalità autocommit non venga abilitata in qualche modo, altrimenti ogni singolo comando inviato è essenzialmente in una transazione separata. – kostix
Manca un po 'di informazioni cruciali: cosa stai usando come driver? 'gorp' IUUC è un mappatore, non un livello di accesso. – kostix