【发布时间】: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