WithTx initiates a transaction and wraps the DB function
(ctx context.Context, client *ent.Client, fn func(tx *ent.Tx) error)
| 168 | |
| 169 | // WithTx initiates a transaction and wraps the DB function |
| 170 | func WithTx(ctx context.Context, client *ent.Client, fn func(tx *ent.Tx) error) error { |
| 171 | tx, err := client.Tx(ctx) |
| 172 | if err != nil { |
| 173 | return err |
| 174 | } |
| 175 | defer func() { |
| 176 | if v := recover(); v != nil { |
| 177 | _ = tx.Rollback() |
| 178 | panic(v) |
| 179 | } |
| 180 | }() |
| 181 | if err = fn(tx); err != nil { |
| 182 | if rerr := tx.Rollback(); rerr != nil { |
| 183 | err = fmt.Errorf("%w: rolling back transaction: %w", err, rerr) |
| 184 | } |
| 185 | return err |
| 186 | } |
| 187 | if err = tx.Commit(); err != nil { |
| 188 | return fmt.Errorf("committing transaction: %w", err) |
| 189 | } |
| 190 | return nil |
| 191 | } |
no test coverage detected