我在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个函数)
最佳答案
进行此操作的更好方法是将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) {
//...
}
这应该可以解决问题。
关于tsql - 是否可以在一次交易中调用Go函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60263824/