我不能说得太具体,但我想我能告诉你的足以让你理解这个问题。首先我使用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()
我错了吗?自从dbmap.Begin()
以来,应该回滚所有东西吗?这是驱动程序实现中的错误吗?非常感谢任何和所有的帮助。谢谢!
更新
测试了https://play.golang.org/p/0L3Vgk8C_F,它可以正常工作,所以我猜这可能与gorp有关。我正在使用v1分支,因为这很快将进入生产,所以稳定性至关重要。我会仔细检查它,但看起来它只是轻微包装。
gorp
是一个映射器,而不是访问层。 - kostixgithub.com/denisenkom/go-mssqldb
我也会将其添加到 OP 中。 - Matthew ClarkMSSQL 2008
上尝试一下这个例子 https://play.golang.org/p/0L3Vgk8C_F?这个例子在我使用MSSQL 2012
时是有效的。如果它可以工作,那么问题可能出在gorp
包上。如果不能工作,那么可能是github.com/denisenkom/go-mssqldb
在MSSQL 2008
上存在问题。 - RoninDev