【问题标题】:single insert statement in transaction事务中的单个插入语句
【发布时间】: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


    【解决方案1】:

    围绕单个插入使用事务并不是最有用的。然而,他们传递了一个函数 fn TxFn,它可能包含一组复杂的 (sql) 语句,从而使给定的结构更加有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      相关资源
      最近更新 更多