Improved WrapInTx error handling
This commit is contained in:
parent
ba791c8b56
commit
c7f668094a
28
main.go
28
main.go
@ -526,19 +526,35 @@ func (s *DB) Rollback() *DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WrapInTx wraps a method in a transaction
|
// WrapInTx wraps a method in a transaction
|
||||||
func (s *DB) WrapInTx(f func(tx *DB) error) error {
|
func (s *DB) WrapInTx(f func(tx *DB) error) (err error) {
|
||||||
if _, ok := s.db.(*sql.Tx); ok {
|
if _, ok := s.db.(*sql.Tx); ok {
|
||||||
// Already in a transaction
|
// Already in a transaction
|
||||||
return f(s)
|
return f(s)
|
||||||
} else {
|
} else {
|
||||||
// Lets start a new transaction
|
// Lets start a new transaction
|
||||||
tx := s.Begin()
|
tx := s.Begin()
|
||||||
if err := f(tx); err != nil {
|
if err = tx.Error; err != nil {
|
||||||
tx.Rollback()
|
return
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
tx.Commit()
|
panicked := true
|
||||||
return nil
|
defer func() {
|
||||||
|
if panicked || err != nil {
|
||||||
|
rollbackErr := tx.Rollback().Error
|
||||||
|
if rollbackErr != nil {
|
||||||
|
if err == nil {
|
||||||
|
err = rollbackErr
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("Transacton code and rollback failed: %s; %s", err, rollbackErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
err = f(tx)
|
||||||
|
if err == nil {
|
||||||
|
err = tx.Commit().Error
|
||||||
|
}
|
||||||
|
panicked = false
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user