2015-09-02 22 views
11

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.

+3

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

+1

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

+2

Manca un po 'di informazioni cruciali: cosa stai usando come driver? 'gorp' IUUC è un mappatore, non un livello di accesso. – kostix

risposta

2

Verificare che l'autocomit non sia abilitato. Molti strumenti da riga di comando, UIS e persino driver consentono di default

+0

Che fa un TON di senso, ma non posso trova qualcosa sull'autocommit in uno dei progetti coinvolti: https://github.com/go-gorp/gorp/tree/v1 per il mio wrapper e https://github.com/denisenkom/go-mssqldb per il driver stesso. C'è qualche altro termine con cui possono chiamarlo? Ho anche cercato il commit, ma nessuno di questi ha portato a nulla. Grazie! –

0

Secondo questo (ho letto poche righe) https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx

autocommit sembra essere su ON defauly, che mi porta a concludere che se l'autore di go-mssqldb non ha implementato on/off per questa funzione è ON.

È possibile passare da soli basta cercare IMPLICIT_TRANSACTIONS SET

+0

"Una connessione a un'istanza del Motore di database funziona in modalità di autocommit fino a quando un'istruzione BEGIN TRANSACTION avvia una transazione esplicita o è attivata la transazione implicita.Quando la transazione esplicita viene impegnata o ripristinata, o quando la modalità di transazione implicita è disattivata, la connessione ritorna alla modalità di autocommit. "Buona idea, ma questo mi fa pensare, non è vero. :-( –