39 lines
554 B
Go
39 lines
554 B
Go
package db
|
||
|
||
import (
|
||
"context"
|
||
)
|
||
|
||
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,
|
||
}
|
||
|
||
// rollback 兜底(防 panic / 提前 return)
|
||
defer func() {
|
||
_ = tx.Rollback(ctx)
|
||
}()
|
||
|
||
// 执行业务
|
||
if err := fn(txClient); err != nil {
|
||
_ = tx.Rollback(ctx)
|
||
return err
|
||
}
|
||
|
||
// commit
|
||
if err := tx.Commit(ctx); err != nil {
|
||
_ = tx.Rollback(ctx)
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|