#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), что делает данную структуру более полезной.