【问题标题】:postgres does not save all data after committingpostgres 提交后不保存所有数据
【发布时间】:2021-08-05 11:45:56
【问题描述】:

在我使用 gorm 作为 ORM 和 posgress 作为数据库的 golang 项目中,在某些情况下,当我开始事务时 更改三个表并提交,仅更改其中一个表。另外两个表数据没有变化。 知道它是怎么发生的吗?

你可以看下面的例子


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
}

只是付款数据发生了变化,我没有收到任何错误。

【问题讨论】:

  • 第二行中的 tx 不是应该从 DB 创建的吗?喜欢tx := o.Begin()
  • 是的,我应该在这里编辑...谢谢。
  • 这段代码还能编译吗?您混合了 Rollback 和 RollBack,您将 tx.Error 成员作为函数调用。每次保存后,您将tx.Save(*) 分配给err,然后从函数中返回它,即使tx.Save 返回与错误接口不兼容的*gorm.DB

标签: postgresql go go-gorm


【解决方案1】:

显然你错误地使用了存档点!在 PostgreSQL 中,我们可以有嵌套事务,即定义保存点将事务拆分为多个部分。我不是 Golang 程序员,我的主要语言不是 Go,但我猜问题是“tx.save”,它创建了一个 SavePoint,并且不将数据保存到数据库中。 SavePoints 创建一个新的事务保存点,因此最后一个表提交。

【讨论】:

  • 此错误并非一直发生,并且我的 gorm 版本(v1)不支持保存点。 Save() 方法在 gorm 中的工作方式如下:db.First(&user) user.Name = "jinzhu 2" user.Age = 100 db.Save(&user) //// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111
【解决方案2】:

如果您熟悉 Node.js,那么任何异步函数回调都会返回错误作为第一个参数。在 Go 中,我们遵循相同的规范。

https://medium.com/rungo/error-handling-in-go-f0125de052f0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多