auto transaction

This commit is contained in:
zhanghelong 2018-09-12 14:20:16 +08:00
parent b91f954f18
commit 8fc5b8b4d7
3 changed files with 13 additions and 12 deletions

1
.gitignore vendored
View File

@ -28,5 +28,6 @@ temp_test.go
.vscode .vscode
xorm.test xorm.test
*.sqlite3 *.sqlite3
test.db.sql
.idea/ .idea/

View File

@ -4,8 +4,8 @@
package xorm package xorm
// AutoTransaction Execute sql wrapped in a transaction(abbr as tx), tx will automatic commit if no errors occurred // Transaction 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) { func (engine *Engine) Transaction(f func(*Session) (interface{}, error)) (interface{}, error) {
session := engine.NewSession() session := engine.NewSession()
defer session.Close() defer session.Close()

View File

@ -15,38 +15,38 @@ import (
func TestAutoTransaction(t *testing.T) { func TestAutoTransaction(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type Test struct { type TestTx struct {
Id int64 `xorm:"autoincr pk"` Id int64 `xorm:"autoincr pk"`
Msg string `xorm:"varchar(255)"` Msg string `xorm:"varchar(255)"`
Created time.Time `xorm:"created"` Created time.Time `xorm:"created"`
} }
assert.NoError(t, testEngine.Sync2(new(Test))) assert.NoError(t, testEngine.Sync2(new(TestTx)))
engine := testEngine.(*Engine) engine := testEngine.(*Engine)
// will success // will success
AutoTransaction(func(session *Session) (interface{}, error) { engine.Transaction(func(session *Session) (interface{}, error) {
_, err := session.Insert(Test{Msg: "hi"}) _, err := session.Insert(TestTx{Msg: "hi"})
assert.NoError(t, err) assert.NoError(t, err)
return nil, nil return nil, nil
}, engine) })
has, err := engine.Exist(&Test{Msg: "hi"}) has, err := engine.Exist(&TestTx{Msg: "hi"})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, true, has) assert.EqualValues(t, true, has)
// will rollback // will rollback
_, err = AutoTransaction(func(session *Session) (interface{}, error) { _, err = engine.Transaction(func(session *Session) (interface{}, error) {
_, err := session.Insert(Test{Msg: "hello"}) _, err := session.Insert(TestTx{Msg: "hello"})
assert.NoError(t, err) assert.NoError(t, err)
return nil, fmt.Errorf("rollback") return nil, fmt.Errorf("rollback")
}, engine) })
assert.Error(t, err) assert.Error(t, err)
has, err = engine.Exist(&Test{Msg: "hello"}) has, err = engine.Exist(&TestTx{Msg: "hello"})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, false, has) assert.EqualValues(t, false, has)
} }