所以我不能太具体,但我认为我能告诉你的就足以解决这个问题了。首先,我正在使用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分支,因为这将很快生产,因此稳定性是关键。我会挑选它,但看起来它只是轻轻地包裹它。
答案 0 :(得分:2)
检查您是否启用了自动套餐。许多命令行工具,uis甚至驱动程序默认启用它
答案 1 :(得分:0)
根据这个(我只读了几行)https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx
autocommit似乎是默默无闻的,这使我得出结论,如果go-mssqldb的作者没有实现此功能的开启/关闭,那就是ON。
您可以自己切换它,只需搜索SET IMPLICIT_TRANSACTIONS