golang mysql事务
2020-08-09 本文已影响0人
杜子龙
func RunTx(connection *db.Connection, fn func(tx *sql.Tx) error) (err error) {
tx, err := connection.Begin()
if err != nil {
return
}
defer func() {
if e := recover(); e != nil {
stack := debugutil.Stack(3)
log.Errorf("[TxFactory] panic recovered:\n%s\n%s", e, stack)
tx.Rollback()
err = fmt.Errorf("tx panic:%s", e)
}
}()
if err := fn(tx); err != nil {
tx.Rollback()
return err
}
if err = tx.Commit(); err != nil {
tx.Rollback()
return
}
return
}