所以我不能太具体,但是我想我可以告诉您的足以解决这个问题。首先,我正在使用gorp进行设置并获得交易。我正在使用github.com/denisenkom/go-mssqldb驱动程序。

然后,我进行了一系列操作,如果操作失败,则执行rollback;如果所有操作均成功,则执行commit。问题在于,它仅回滚失败的语句,而不回退其余操作。我想这不是应该的工作方式吗?

这是一些粗略的伪代码,可让您更好地了解我在说什么:

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分支,因为这将很快投入生产,因此稳定性是关键。我将仔细研究它,但是看起来它只是轻轻地包裹了一下。

最佳答案

检查您没有启用自动提交。默认情况下,许多命令行工具,uis甚至驱动程序都将其启用

10-06 14:20