add support for mulitple transactions on one session (#1015)

This commit is contained in:
Lunny Xiao 2018-06-20 17:14:43 +08:00 committed by GitHub
parent a8bd843a55
commit ee5b31ecae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 65 additions and 0 deletions

View File

@ -24,6 +24,7 @@ func (session *Session) Rollback() error {
if !session.isAutoCommit && !session.isCommitedOrRollbacked {
session.saveLastSQL(session.engine.dialect.RollBackStr())
session.isCommitedOrRollbacked = true
session.isAutoCommit = true
return session.tx.Rollback()
}
return nil
@ -34,6 +35,7 @@ func (session *Session) Commit() error {
if !session.isAutoCommit && !session.isCommitedOrRollbacked {
session.saveLastSQL("COMMIT")
session.isCommitedOrRollbacked = true
session.isAutoCommit = true
var err error
if err = session.tx.Commit(); err == nil {
// handle processors after tx committed

View File

@ -128,3 +128,66 @@ func TestCombineTransactionSameMapper(t *testing.T) {
err = session.Commit()
assert.NoError(t, err)
}
func TestMultipleTransaction(t *testing.T) {
assert.NoError(t, prepareEngine())
type MultipleTransaction struct {
Id int64
Name string
}
assertSync(t, new(MultipleTransaction))
session := testEngine.NewSession()
defer session.Close()
err := session.Begin()
assert.NoError(t, err)
m1 := MultipleTransaction{Name: "xiaoxiao2"}
_, err = session.Insert(&m1)
assert.NoError(t, err)
user2 := MultipleTransaction{Name: "zzz"}
_, err = session.Where("id = ?", 0).Update(&user2)
assert.NoError(t, err)
err = session.Commit()
assert.NoError(t, err)
var ms []MultipleTransaction
err = session.Find(&ms)
assert.NoError(t, err)
assert.EqualValues(t, 1, len(ms))
err = session.Begin()
assert.NoError(t, err)
_, err = session.Where("id=?", m1.Id).Delete(new(MultipleTransaction))
assert.NoError(t, err)
err = session.Commit()
assert.NoError(t, err)
ms = make([]MultipleTransaction, 0)
err = session.Find(&ms)
assert.NoError(t, err)
assert.EqualValues(t, 0, len(ms))
err = session.Begin()
assert.NoError(t, err)
_, err = session.Insert(&MultipleTransaction{
Name: "ssss",
})
assert.NoError(t, err)
err = session.Rollback()
assert.NoError(t, err)
ms = make([]MultipleTransaction, 0)
err = session.Find(&ms)
assert.NoError(t, err)
assert.EqualValues(t, 0, len(ms))
}