我正在使用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
}
那么在事务中包装单个插入语句有什么意义呢?
答案 0 :(得分:0)
在单个插入周围使用事务不是最有用的。但是,他们正在传递函数BannerComponent
,该函数可能包含一组复杂的(sql)语句,从而使给定的结构更有用。