是否可以在一次交易中调用 Go 函数?

Is it possible to call Go functions in one transactions?

我在 PostgreSQL 中存储了一个双向链表。我有一个 Go API 来管理这个列表。

有一个函数可以创建新的 Node(在特定位置)。假设其中有一个 INSERT SQL 查询。

另外还有一个删除Node的函数(按id)。假设其中有一个 DELETE SQL 查询。

众所周知,如果您需要将 Node 移动到不同的位置,您应该调用 DeleteNode() 函数和 CreateNode() 函数。所以有第三个函数叫做 MoveNode()

func MoveNode() error {
  if err := DeleteNode(); err != nil {
    return err
  }
  if err := CreateNode(); err != nil {
    return err
  }
  return nil
}

但是这些函数(在 MoveNode() 内部)应该在一个事务中调用。

有没有办法在 Go 中实现 "merge" 函数?或者解决这个问题的方法是什么(除了将代码从 2 个函数复制粘贴到第三个)?

p.s 想法很简单:您有两个函数执行一些 SQL 查询,您需要在一个事务中执行这些查询(或在一个事务中调用 2 个函数)

这里解决这个问题的更好方法是将 tx.Commit() 移到查询执行函数之外(此处为 DeleteNode() 和 CreateNode())

建议的解决方案:

func MoveNode() error {
   tx, err := db.Begin()
   // err handling

  res, err := DeleteNode(tx)
  // err handling

  res, err := CreateNode(tx)
  // err handling

  tx.Commit()
}

func DeleteNode(transactionFromDbBegin) (responseFromExec, errorFromExec) {
    //...
}

func CreateNode(transactionFromDbBegin) (responseFromExec, errorFromExec) {
    //...
}

这应该可以解决问题。