我在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个函数)
答案 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) {
//...
}
这应该可以解决问题。