|
@@ -45,7 +45,7 @@ const (
|
|
|
|
|
|
|
|
|
|
|
|
-func Transaction(executor Executor, txFunc func(tx Executor) error) error {
|
|
|
+func Transaction(executor Executor, txFunc func(tx Executor) error) (err error) {
|
|
|
if executor == nil {
|
|
|
return nil
|
|
|
}
|
|
@@ -57,11 +57,20 @@ func Transaction(executor Executor, txFunc func(tx Executor) error) error {
|
|
|
switch e := executor.(type) {
|
|
|
case *operations.Operations:
|
|
|
tx := e.BeginTransaction()
|
|
|
- err := txFunc(tx)
|
|
|
+
|
|
|
+ defer func() {
|
|
|
+ if r := recover(); r != nil {
|
|
|
+ tx.RollbackTransaction()
|
|
|
+ err = errors.Errorf("panic: %v", r)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ err = txFunc(tx)
|
|
|
if err != nil {
|
|
|
tx.RollbackTransaction()
|
|
|
return err
|
|
|
}
|
|
|
+
|
|
|
tx.CommitTransaction()
|
|
|
default:
|
|
|
return nil
|