在我的golang项目中,使用gorm作为ORM,使用posgress作为数据库,在某些情况下,当我开始事务更改三个表并提交,只有一个表更改。另外两个表的数据不变。你知道这是怎么发生的吗?
你可以看到下面的例子
o := *gorm.DB
tx := o.Begin()
invoice.Number = 1
err := tx.Save(&invoice)
if err != nil {
err2 := tx.RollBack().Error()
return err
}
receipt.Ref = "1331"
err = tx.Save(&receipt)
if err != nil {
err2 := tx.RollBack().Error()
return err
}
payment.status = "succeed"
err = tx.Save(&payment)
if err != nil {
err2 := tx.RollBack().Error()
return err
}
err = tx.Commit()
if err != nil {
err2 := tx.Rollback()
return err
}
只是付款数据发生了变化,我没有收到任何错误。
显然您错误地使用了保存点!在PostgreSQL中,我们可以有嵌套的事务,也就是说,定义保存点可以将事务拆分为多个部分。我不是Golang程序员,我的主要语言不是Go,但我想问题是"tx.save";它生成SavePoint,并且不将数据保存到数据库中。SavePoints创建一个新的事务保存点,从而提交最后一个表。
如果您熟悉Node.js,那么任何异步函数回调都会返回一个错误作为第一个参数。在围棋中,我们遵循同样的准则。
https://medium.com/rungo/error-handling-in-go-f0125de052f0