Можно ли вызывать Go функций в одной транзакции? - PullRequest
0 голосов
/ 17 февраля 2020

Я храню двойной связанный список в PostgreSQL. У меня есть Go API для управления этим списком.

Есть функция, которая создает новые Node (в указанной позиции c). Давайте предположим, что внутри него есть запрос 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? Или как решить эту проблему (кроме копирования и вставки кода из двух функций в третью)?

ps Идея проста: у вас есть две функции, которые выполняют несколько SQL запросов, и вам нужно выполнить эти запросы в одной транзакции (или вызвать 2 функции в одной транзакции)

1 Ответ

2 голосов
/ 17 февраля 2020

Лучший способ go об этом здесь заключается в перемещении 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) {
    //...
}

Это должно сработать.

...