enhancement: auto-transaction

This commit is contained in:
zhanghelong 2018-09-08 20:23:20 +08:00
parent e88d320934
commit b91f954f18
2 changed files with 78 additions and 0 deletions

26
transaction.go Normal file
View File

@ -0,0 +1,26 @@
// Copyright 2018 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package xorm
// AutoTransaction Execute sql wrapped in a transaction(abbr as tx), tx will automatic commit if no errors occurred
func AutoTransaction(f func(*Session) (interface{}, error), engine *Engine) (interface{}, error) {
session := engine.NewSession()
defer session.Close()
if err := session.Begin(); err != nil {
return nil, err
}
result, err := f(session)
if err != nil {
return nil, err
}
if err := session.Commit(); err != nil {
return nil, err
}
return result, nil
}

52
transancation_test.go Normal file
View File

@ -0,0 +1,52 @@
// Copyright 2017 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package xorm
import (
"fmt"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestAutoTransaction(t *testing.T) {
assert.NoError(t, prepareEngine())
type Test struct {
Id int64 `xorm:"autoincr pk"`
Msg string `xorm:"varchar(255)"`
Created time.Time `xorm:"created"`
}
assert.NoError(t, testEngine.Sync2(new(Test)))
engine := testEngine.(*Engine)
// will success
AutoTransaction(func(session *Session) (interface{}, error) {
_, err := session.Insert(Test{Msg: "hi"})
assert.NoError(t, err)
return nil, nil
}, engine)
has, err := engine.Exist(&Test{Msg: "hi"})
assert.NoError(t, err)
assert.EqualValues(t, true, has)
// will rollback
_, err = AutoTransaction(func(session *Session) (interface{}, error) {
_, err := session.Insert(Test{Msg: "hello"})
assert.NoError(t, err)
return nil, fmt.Errorf("rollback")
}, engine)
assert.Error(t, err)
has, err = engine.Exist(&Test{Msg: "hello"})
assert.NoError(t, err)
assert.EqualValues(t, false, has)
}