github.com/gogf/gf@v1.16.9/.example/database/gdb/mysql/gdb_transaction_closure.go (about)

     1  package main
     2  
     3  import (
     4  	"github.com/gogf/gf/database/gdb"
     5  	"github.com/gogf/gf/frame/g"
     6  )
     7  
     8  func main() {
     9  	var (
    10  		err   error
    11  		db    = g.DB()
    12  		table = "user"
    13  	)
    14  	if err = db.Transaction(func(tx *gdb.TX) error {
    15  		// Nested transaction 1.
    16  		if err = tx.Transaction(func(tx *gdb.TX) error {
    17  			_, err = tx.Model(table).Data(g.Map{"id": 1, "name": "john"}).Insert()
    18  			return err
    19  		}); err != nil {
    20  			return err
    21  		}
    22  		// Nested transaction 2, panic.
    23  		if err = tx.Transaction(func(tx *gdb.TX) error {
    24  			_, err = tx.Model(table).Data(g.Map{"id": 2, "name": "smith"}).Insert()
    25  			// Create a panic that can make this transaction rollback automatically.
    26  			panic("error")
    27  		}); err != nil {
    28  			return err
    29  		}
    30  		return nil
    31  	}); err != nil {
    32  		panic(err)
    33  	}
    34  }