交易中的单个插入语句

时间:2020-09-25 15:33:52

标签: postgresql api go transactions

我正在使用Golang为我的后端项目创建一些API,并从github获得了一些示例。

我找到了Exitus(https://github.com/wolfeidau/exitus),这是一个具有一些基本CRUD的简单API,例如,在comments中使用issue,他们有Get, Create, Update, List

Get, Update, List像这样使用单个查询

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

但是通过插入,他们将单个插入语句包装在这样的事务中

err := db.WithTransaction(ctx, cs.dbconn, func(tx db.Transaction) error {
    return tx.QueryRowContext(
        ctx, qry.Query(query, qry.Args()...,).Scan(&comment.Id, &comment.Content, &comment.CreatedAt, &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

}

那么在事务中包装单个插入语句有什么意义呢?

1 个答案:

答案 0 :(得分:0)

在单个插入周围使用事务不是最有用的。但是,他们正在传递函数BannerComponent,该函数可能包含一组复杂的(sql)语句,从而使给定的结构更有用。