我在用

https://pkg.go.dev/github.com/jmoiron/sqlx@v1.2.0

连接到Postgres并进行查询. 我是否应该执行事务.如果事务提交失败,则回滚

示例

    tx, err := appState.PgConn.Beginx()
    if err != nil {
        return err
    }

    // then some queries using this tx reference

在那之后,当我们提交事务时,我们应该这样做吗? 方法1

err:= tx.Commit()
if err != nil {
    return err;
}

或者我们应该使用 方法2

err1 := tx.Commit()
if err1 != nil {
   err2:= tx.Rollback()
   if err2 !=nil {
      return err2
   }
}

推荐答案

sqlx Tx type是关于sql.Tx的包装器,该类型的文档声明:

在调用COMMIT或ROLLBACK之后,事务上的所有操作都会失败,并返回ErrTxDone.

因此,在Commit之后调用RollBack(无论成功与否)不会有任何影响(并将返回ErrTxDone).您可以在代码here中看到这一点.这意味着在已经呼叫Commit之后没有理由再呼叫Rollback(因此使用方法1).

Go相关问答推荐

map 中的多个函数类型,Golang

JetBrains Goland,禁用突出显示测试文件

如何在链接中写入链接

Python样式生成器实现为通道:过早读取

有没有办法让sqlc生成可以使用pgxpool的代码

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

如何匹配两次出现的相同但随机字符串之间的字符

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

errors.Wrap 和 errors.WithMessage 有什么区别

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

不能使用 mockDB(*MockDB 类型的变量)作为 struct 文字中的 *gorm.DB 值

如何在切片增长时自动将切片的新元素添加到函数参数

每次有人进入我的网站时如何运行特定功能?

如何使用 math/big 对 bigInt 进行取模?

在 Raspberry Pi4 上下载 Go Mod

Golang BigInt 部门

无法识别同步错误.使用一次

Go/Golang:如何从 big.Float 中提取最低有效数字?

即使没有竞争条件也没有得到任何输出

将函数的值作为输入参数返回给另一个