один оператор insert в транзакции

#postgresql #api #go #transactions

#postgresql #API #Вперед #транзакции

Вопрос:

Я создаю несколько API-интерфейсов для своего серверного проекта с помощью Golang и получил несколько примеров из github.

Я нашел Exitus (https://github.com/wolfeidau/exitus ), который представляет собой простой API с некоторым базовым CRUD, например, с comments in an issue , который у них есть Get, Create, Update, List .

Хотя Get, Update, List они используют один запрос, например

 db.QueryContext(ctx, "SELECT id, content, created_at, updated_at FROM comments " query, args...)
  

Но с помощью insert они переносят один оператор insert в транзакцию следующим образом

 err := db.WithTransaction(ctx, cs.dbconn, func(tx db.Transaction) error {
    return tx.QueryRowContext(
        ctx, qry.Query(query, qry.Args()...,).Scan(amp;comment.Id, amp;comment.Content, amp;comment.CreatedAt, amp;comment.UpdatedAt)
  

Вот WithTransaction функция:

 func WithTransaction(ctx context.Context, db *sql.DB, fn TxFn) (err error) {
tx, err := db.BeginTx(ctx, nil)
if err != nil {
    return
}
defer func() {
    if err != nil {
        rollErr := tx.Rollback()
        if rollErr != nil {
            err = multierror.Append(err, rollErr)
        }
        return
    }
    err = tx.Commit()
}()

err = fn(tx)
return
  

}

Итак, в чем смысл переноса одного оператора insert в транзакцию?

Ответ №1:

Использование транзакции вокруг одной вставки не самое полезное. Однако они передают функцию fn TxFn , которая может содержать сложный набор операторов (sql), что делает данную структуру более полезной.