文档:
    https://goframe.org/pages/viewpage.action?pageId=1114286

    常用:

    1. db.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
    2. _, err := tx.Model("").Ctx(ctx).Where("shop_id = ?", shopId).Delete()
    3. if err != nil {
    4. return err
    5. }
    6. return nil
    7. })

    事物嵌套

    1. db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
    2. // Nested transaction 1.
    3. if err := db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
    4. _, err := db.Model(table).Ctx(ctx).Data(g.Map{"id": 1, "name": "john"}).Insert()
    5. return err
    6. }); err != nil {
    7. return err
    8. }
    9. // Nested transaction 2, panic.
    10. if err := db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
    11. _, err := db.Model(table).Ctx(ctx).Data(g.Map{"id": 2, "name": "smith"}).Insert()
    12. // Create a panic that can make this transaction rollback automatically.
    13. panic("error")
    14. return err
    15. }); err != nil {
    16. return err
    17. }
    18. return nil
    19. })