Поэтому я не могу быть слишком конкретным, но я думаю, что я могу вам сказать, будет достаточно, чтобы понять это. Сначала я использую gorp для настройки и получения транзакции. Я использую драйвер github.com/denisenkom/go-mssqldb
.
Затем я выполняю ряд операций, и если из них не удается я rollback
, и если все имеют успех я commit
. Проблема в том, что он только откатывает утверждение, которое не удалось, а не остальные операции. Я ошибаюсь, что это не так, как это должно работать?
Вот несколько грубого psudocode, чтобы дать вам лучшее представление о том, что я говорю:
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()
Я ошибаюсь, что должно rollback
все, начиная с dbmap.Begin()
? Это ошибка в реализации драйвера? Любая помощь приветствуется. Спасибо!
Обновление
Протестировано https://play.golang.org/p/0L3Vgk8C_F, и это сработало, поэтому я предполагаю, что это означает, что это связано с gorp. Я использую ветвь v1, так как это скоро будет производство, и поэтому стабильность является ключевой. Я буду разбирать его, но похоже, что он просто слегка обертывает его.