11

所以我不能说得太具体,但我认为我能告诉你的就足以解决这个问题。首先,我使用 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 分支,因为这将很快投入生产,因此稳定性是关键。我会挑选它,但它看起来只是轻轻地包裹它。

4

2 回答 2

2

检查您没有启用自动提交。许多命令行工具、uis 甚至驱动程序都默认启用它

于 2015-10-13T06:57:15.487 回答
0

据此(我只看了几行)https://technet.microsoft.com/en-us/library/ms187878 (v=sql.105).aspx

autocommit 似乎默认为 ON,这使我得出结论,如果 go-mssqldb 的作者没有为此功能实现 on/off,则它是 ON。

您可以自己切换它,只需搜索 SET IMPLICIT_TRANSACTIONS

于 2015-10-13T16:11:53.447 回答