SQL/数据库事务在使用MS SQL时无法正确回滚

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()

我错了吗?自从dbmap.Begin()以来,应该回滚所有东西吗?这是驱动程序实现中的错误吗?非常感谢任何和所有的帮助。谢谢!

更新

测试了https://play.golang.org/p/0L3Vgk8C_F,它可以正常工作,所以我猜这可能与gorp有关。我正在使用v1分支,因为这很快将进入生产,所以稳定性至关重要。我会仔细检查它,但看起来它只是轻微包装。


3
你有尝试使用SQL管理工具套件中的SQL Profiler查看跟踪吗?我会检查是否实际发送了预期的命令。 - kostix
1
下一步要检查的是验证自动提交模式没有被启用,否则您发送的每个命令实际上都在单独的事务中。 - kostix
2
一个关键的信息缺失:你在使用什么驱动程序?gorp是一个映射器,而不是访问层。 - kostix
1
当然,您关于驱动程序的说法是正确的。我本来想在信息中包含它,但我想我忘了。github.com/denisenkom/go-mssqldb 我也会将其添加到 OP 中。 - Matthew Clark
你能否在 MSSQL 2008 上尝试一下这个例子 https://play.golang.org/p/0L3Vgk8C_F?这个例子在我使用 MSSQL 2012 时是有效的。如果它可以工作,那么问题可能出在 gorp 包上。如果不能工作,那么可能是 github.com/denisenkom/go-mssqldbMSSQL 2008 上存在问题。 - RoninDev
显示剩余3条评论
2个回答

2

请检查您是否启用了自动提交。许多命令行工具、用户界面甚至驱动程序默认启用它。


这很有道理,但我在涉及的两个项目中都找不到关于autocommit的任何信息:我的包装器https://github.com/go-gorp/gorp/tree/v1和驱动程序本身https://github.com/denisenkom/go-mssqldb。他们可能用其他术语来称呼它吗?我也搜索了commit,但没有任何结果。谢谢! - Matthew Clark

0

一个连接到数据库引擎实例的操作在自动提交模式下运行,直到BEGIN TRANSACTION语句开始显式事务或设置隐式事务。当显式事务提交或回滚,或者关闭隐式事务模式时,连接将返回自动提交模式。这是个好想法,但让我想到了,那不是它。 :-( - Matthew Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接