35 lines
522 B
Go
35 lines
522 B
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
// WithTx 开启事务(在当前 client 上)
|
|
func (c *Client) WithTx(ctx context.Context, fn func(tx *Client) error) error {
|
|
tx, err := c.pool.Begin(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 创建事务 client
|
|
txClient := &Client{
|
|
pool: c.pool,
|
|
tx: tx,
|
|
}
|
|
|
|
defer func(tx pgx.Tx, ctx context.Context) {
|
|
err := tx.Rollback(ctx)
|
|
if err != nil {
|
|
|
|
}
|
|
}(tx, ctx)
|
|
|
|
if err := fn(txClient); err != nil {
|
|
return err
|
|
}
|
|
|
|
return tx.Commit(ctx)
|
|
}
|