Kaynağa Gözat

enhancement: auto-transaction

* enhancement: auto-transaction

* auto transaction
xormplus 7 yıl önce
ebeveyn
işleme
2a9b1c32ea
2 değiştirilmiş dosya ile 78 ekleme ve 0 silme
  1. 26 0
      transaction.go
  2. 52 0
      transancation_test.go

+ 26 - 0
transaction.go

@@ -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
+
+// Transaction Execute sql wrapped in a transaction(abbr as tx), tx will automatic commit if no errors occurred
+func (engine *Engine) Transaction(f func(*Session) (interface{}, error)) (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 - 0
transancation_test.go

@@ -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 TestTx struct {
+		Id      int64     `xorm:"autoincr pk"`
+		Msg     string    `xorm:"varchar(255)"`
+		Created time.Time `xorm:"created"`
+	}
+
+	assert.NoError(t, testEngine.Sync2(new(TestTx)))
+
+	engine := testEngine.(*Engine)
+
+	// will success
+	engine.Transaction(func(session *Session) (interface{}, error) {
+		_, err := session.Insert(TestTx{Msg: "hi"})
+		assert.NoError(t, err)
+
+		return nil, nil
+	})
+
+	has, err := engine.Exist(&TestTx{Msg: "hi"})
+	assert.NoError(t, err)
+	assert.EqualValues(t, true, has)
+
+	// will rollback
+	_, err = engine.Transaction(func(session *Session) (interface{}, error) {
+		_, err := session.Insert(TestTx{Msg: "hello"})
+		assert.NoError(t, err)
+
+		return nil, fmt.Errorf("rollback")
+	})
+	assert.Error(t, err)
+
+	has, err = engine.Exist(&TestTx{Msg: "hello"})
+	assert.NoError(t, err)
+	assert.EqualValues(t, false, has)
+}