Merge branch 'master' into master

This commit is contained in:
Jinzhu 2019-12-05 17:58:37 +08:00 committed by GitHub
commit 9897f80b46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 16 deletions

11
main.go
View File

@ -528,12 +528,12 @@ func (s *DB) Debug() *DB {
// Transaction start a transaction as a block, // Transaction start a transaction as a block,
// return error will rollback, otherwise to commit. // return error will rollback, otherwise to commit.
func (s *DB) Transaction(fc func(tx *DB) error) (err error) { func (s *DB) Transaction(fc func(tx *DB) error) (err error) {
panicked := true
tx := s.Begin() tx := s.Begin()
defer func() { defer func() {
if r := recover(); r != nil { // Make sure to rollback when panic, Block error or Commit error
err = fmt.Errorf("%s", r) if panicked || err != nil {
tx.Rollback() tx.Rollback()
return
} }
}() }()
@ -543,10 +543,7 @@ func (s *DB) Transaction(fc func(tx *DB) error) (err error) {
err = tx.Commit().Error err = tx.Commit().Error
} }
// Makesure rollback when Block error or Commit error panicked = false
if err != nil {
tx.Rollback()
}
return return
} }

View File

@ -470,6 +470,15 @@ func TestTransaction(t *testing.T) {
} }
} }
func assertPanic(t *testing.T, f func()) {
defer func() {
if r := recover(); r == nil {
t.Errorf("The code did not panic")
}
}()
f()
}
func TestTransactionWithBlock(t *testing.T) { func TestTransactionWithBlock(t *testing.T) {
// rollback // rollback
err := DB.Transaction(func(tx *gorm.DB) error { err := DB.Transaction(func(tx *gorm.DB) error {
@ -511,6 +520,7 @@ func TestTransactionWithBlock(t *testing.T) {
} }
// panic will rollback // panic will rollback
assertPanic(t, func() {
DB.Transaction(func(tx *gorm.DB) error { DB.Transaction(func(tx *gorm.DB) error {
u3 := User{Name: "transcation-3"} u3 := User{Name: "transcation-3"}
if err := tx.Save(&u3).Error; err != nil { if err := tx.Save(&u3).Error; err != nil {
@ -523,6 +533,7 @@ func TestTransactionWithBlock(t *testing.T) {
panic("force panic") panic("force panic")
}) })
})
if err := DB.First(&User{}, "name = ?", "transcation").Error; err == nil { if err := DB.First(&User{}, "name = ?", "transcation").Error; err == nil {
t.Errorf("Should not find record after panic rollback") t.Errorf("Should not find record after panic rollback")