sql / db事务没有使用ms sql正确回滚

时间:2015-09-02 03:18:33

标签: sql-server-2008 go transactions gorp

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

2 个答案:

答案 0 :(得分:2)

检查您是否启用了自动套餐。许多命令行工具,uis甚至驱动程序默认启用它

答案 1 :(得分:0)

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

autocommit似乎是默默无闻的,这使我得出结论,如果go-mssqldb的作者没有实现此功能的开启/关闭,那就是ON。

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