Salmon的全栈知识 Salmon的全栈知识
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • Gateway
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • Gateway
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Gin 介绍
  • Gin 环境搭建
  • golang 程序的热加载
  • Gin 框架中的路由
  • Gin HTML 模板渲染
  • 静态文件服务
  • 路由详解
  • Gin 中自定义控制器
  • Gin 中间件
  • Gin 中自定义 Model
  • Gin 文件上传
  • Gin 中的 Cookie
  • Gin 中的 Session
  • Gin 中使用 GORM 操作 mysql 数据库
  • 原生 SQL 和 SQL 生成器
  • Gin 中使用 GORM 实现表关联查询
  • GORM 中使用事务
    • 1、禁用默认事务
    • 2、事务
      • 2.1、事务执行流程
      • 2.2、事务(手动控制)
      • 2.3、张三给李四转账
  • Gin 中使用 go-ini 加载.ini 配置文件
  • 《Gin》笔记
Salmon
2025-04-05
目录

GORM 中使用事务

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全执行,要么全不执行。

# 1、禁用默认事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。

package models

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
    "log"
)

var DB *gorm.DB
var err error

func Init() {
    dsn := "root:123456@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"
    DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
       QueryFields:            true,                                // 查询语句中会显式列出所有字段名
       Logger:                 logger.Default.LogMode(logger.Info), // 打印完整 SQL
       SkipDefaultTransaction: true,                                // 禁用默认事务
    })
    if err != nil {
       log.Fatal("数据库连接失败:", err)
    }
    // 自动创建表
    err = DB.AutoMigrate(&User{})
    if err != nil {
       log.Fatal("自动建表失败:", err)
    }
    log.Println("数据库表已创建或同步成功")
    //DB.Debug() 临时打印执行sql
}

GORM 默认会将单个的 create, update, delete 操作封装在事务内进行处理,以确保数据的完整性。

如果你想把多个 create, update, delete 操作作为一个原子操作,Transaction 就是用来完成这个的。

# 2、事务

https://gorm.io/zh_CN/docs/transactions.html

# 2.1、事务执行流程

要在事务中执行一系列操作,通常您可以参照下面的流程来执行。

models.DB.Transaction(func(tx *gorm.DB) error {
    // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
    if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
       // 返回任何错误都会回滚事务
       return err
    }
    if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
       return err
    }
    // 返回 nil 提交事务
    return nil
})

# 2.2、事务(手动控制)

// 开启事务
tx := db.Begin()
// 在事务中做一些数据库操作 (这里应该使用 'tx' ,而不是 'db')
tx.Create(...)
// ... 
// 有错误时,手动调用事务的 Rollback()
tx.Rollback()
// 无错误时,手动调用事务的 Commit()
tx.Commit()

# 2.3、张三给李四转账

type TransitionController struct {
    BaseController
}

func (con TransitionController) Index(c *gin.Context) {
    tx := models.DB.Begin()
    defer func() {
       if r := recover(); r != nil {
          tx.Rollback()
          con.error(c)
       }
    }()
    if err := tx.Error; err != nil {
       fmt.Println(err)
       con.error(c)
    }
    // 张三账户减去 100
    u1 := models.Bank{Id: 1}
    tx.Find(&u1)
    u1.Balance = u1.Balance - 100
    if err := tx.Save(&u1).Error; err != nil {
       tx.Rollback()
       con.error(c)
    }
    // panic("遇到了错误")
    // 李四账户增加 100
    u2 := models.Bank{Id: 2}
    tx.Find(&u2)
    u2.Balance = u2.Balance + 100
    // panic("失败")
    if err := tx.Save(&u2).Error; err != nil {
       tx.Rollback()
       con.error(c)
    }
    tx.Commit()
    con.success(c)
}
上次更新: 2025/04/11, 00:13:59
Gin 中使用 GORM 实现表关联查询
Gin 中使用 go-ini 加载.ini 配置文件

← Gin 中使用 GORM 实现表关联查询 Gin 中使用 go-ini 加载.ini 配置文件→

Theme by Vdoing | Copyright © 2022-2025 Salmon's Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式