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

时间:2020-02-17 13:44:25

标签: tsql go 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中是否可以“合并”功能?或解决此问题的方法是什么(将代码从2个功能复制粘贴到第三个功能之外)?

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

1 个答案:

答案 0 :(得分: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) {
    //...
}

这应该可以解决问题。