【问题标题】:Is it possible to call Go functions in one transactions?是否可以在一笔交易中调用 Go 函数?
【发布时间】:2020-06-01 11:11:50
【问题描述】:

我在 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 个函数)

【问题讨论】:

  • 你能在这里分享 DeleteNode() 和 CreateNode() 代码吗?执行创建和删除查询后是否可以使用 tx.Commit() ?
  • @可以在 DeleteNode() 或 CreateNode() 等单个函数中使用 tx.Commit()。但是我找不到包装这个函数然后调用 tx.Commit 的方法。此外,我认为为 DeleteNode() 和 CreateNode() 函数提供代码没有用处,因为它们内部只有几个标准 SQL 查询。
  • 所有函数,无论是 DeleteNode() 和 CreateNode() 都需要传递您在执行 tx := db.Begin() 时获得的事务,它们可以从tx.Exec(query) 然后调用 DeleteNode 和 CreateNode 的函数必须执行 tx.Commit() ,我想这会解决你的问题。因此,您将事务移出这些函数,并在 DeleteNode 和 CreateNode 函数中使用 tx.Exec(query)。请让我知道这是否有帮助?
  • 您的代码将如下所示: func DeleteNode(transactionFromDbBegin) (responseFromExec, errorFromExec) 和 func CreateNode(transactionFromDbBegin) (responseFromExec, errorFromExec) 和 MoveNode 将具有 tx = DB.Begin() 并调用 DeleteNode( tx) 并调用 CreateNode(tx) 并以 tx.Commit() 结束。我认为这应该可以解决问题。
  • @Kartavya 是的,这就是我想要的,谢谢)

标签: tsql go transactions


【解决方案1】:

在此处解决此问题的更好方法是将 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) {
    //...
}

这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 2020-08-23
    • 2019-10-15
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多