【发布时间】:2021-01-11 23:16:25
【问题描述】:
我正在使用 Golang 为我的后端项目创建一些 API,并从 github 获取了一些示例。
我找到了 Exitus (https://github.com/wolfeidau/exitus),它是一个带有一些基本 CRUD 的简单 API,例如在 issue 中使用 comments,他们有 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
}
那么在事务中包装单个插入语句有什么意义呢?
【问题讨论】:
标签: postgresql api go transactions