Improved WrapInTx error handling

This commit is contained in:
anton98i 2022-08-23 16:07:44 +02:00 committed by Gerhard Gruber
parent ba791c8b56
commit c7f668094a

28
main.go
View File

@ -526,19 +526,35 @@ func (s *DB) Rollback() *DB {
}
// 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 {
// Already in a transaction
return f(s)
} else {
// Lets start a new transaction
tx := s.Begin()
if err := f(tx); err != nil {
tx.Rollback()
return err
if err = tx.Error; err != nil {
return
}
tx.Commit()
return nil
panicked := true
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
}
}