当前位置:   article > 正文

[golang gin框架] 9.Gin GORM 中使用事务以及go-ini加载.ini配置文件_gin 事务

gin 事务

一.事务

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

1.禁用默认事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除),如果没有这方面的要求,可以在初始化时禁用它,这将获得大约 30%+ 性能提升,禁用默认的事务代码如下:
  1. package models
  2. //gorm文档: https://gorm.io/zh_CN/docs/index.html
  3. //连接数据库核心代码
  4. import (
  5. "fmt"
  6. "gorm.io/gorm"
  7. "gorm.io/driver/mysql"
  8. )
  9. //全局使用DB,就需要把DB定义成公有的
  10. var DB *gorm.DB
  11. var err error
  12. //自动初始化数据库
  13. func init() {
  14. // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  15. dsn := "root:123456@tcp(127.0.0.1:3306)/gin?charset=utf8mb4&parseTime=True&loc=Local"
  16. DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
  17. SkipDefaultTransaction : true, //禁用事物
  18. QueryFields: true, // 打印sql
  19. })
  20. if err != nil {
  21. fmt.Println(err)
  22. }
  23. }
GORM 默认会将单个的 create, update, delete 操作封装在事务内进行处理,以确保数据的完整性。如果想把多个 create, update, delete 操作作为一个原子操作,就要使用Transaction来完成

2.事务相关操作

2.1事务执行流程

要在事务中执行一系列操作,通您可以参照下面的流程来执行
  1. db.Transaction(func(tx *gorm.DB) error {
  2.     // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  3.     if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
  4.         // 返回任何错误都会回滚事务
  5.         return err
  6.     }
  7.     if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
  8.         return err
  9.     }
  10.     // 返回 nil 提交事务
  11.     return nil
  12. })

2.2事务(手动控制)

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

2.3案例:张三给李四转账

  1. package admin
  2. import (
  3. "gindemo/models"
  4. "github.com/gin-gonic/gin"
  5. )
  6. //定义一个BankController结构体,可以实例化结构体访问里面的方法
  7. type BankController struct {
  8. BaseController // 继承基础控制器
  9. }
  10. //列表
  11. func (con BankController) Index(c *gin.Context) {
  12. //开启事务
  13. tx := models.DB.Begin()
  14. //抛出异常
  15. defer func() {
  16. if r := recover(); r != nil {
  17. tx.Rollback()
  18. //遇到错误时回滚事务
  19. //转账失败
  20. con.error(c)
  21. return
  22. }
  23. }()
  24. //panic("异常了")
  25. // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  26. // 张三给李四转账
  27. // 张三账号上减去100元
  28. u1 := models.Bank{Id: 1}
  29. tx.Find(&u1)
  30. u1.Balance = u1.Balance - 100
  31. //判断保存数据是否正确,如果不正确,则回滚
  32. if err := tx.Save(&u1).Error; err != nil {
  33. tx.Rollback()
  34. //转账失败
  35. con.error(c)
  36. return
  37. }
  38. //李四账号上增加100元
  39. u2 := models.Bank{Id: 2}
  40. tx.Find(&u2)
  41. u2.Balance = u2.Balance + 100
  42. //判断保存数据是否正确,如果不正确,则回滚
  43. if err := tx.Save(&u2).Error; err != nil {
  44. tx.Rollback()
  45. //转账失败
  46. con.error(c)
  47. return
  48. }
  49. tx.Commit()
  50. //转账成功
  51. con.success(c)
  52. }

更多事务相关,请参考官网:事务 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

二.go-ini加载.ini配置文件

1.go-ini 介绍

go-ini 官方介绍,go-ini 是地表 最强大最方便 最流行 的 Go 语言 INI 文件操作库

Github 地址GitHub - go-ini/ini: Package ini provides INI file read and write functionality in Go

官方文档:go-ini/ini: A fantastic package for INI manipulations in Go

2.go-ini 使用

2.1新建 conf/app.ini

编辑 app.ini 文件并输入以下内容

<code class="language-plaintext hljs">app_name  = app测试
# 错误级别: DEBUG,INFO,WARNING,ERROR,FATAL
log_level = DEBUG
app_mode  = production

[mysql]
ip       = 127.0.0.1
port     = 3306
user     = root
password = 123456
database = gin

[redis]
ip       = 127.0.0.1
port     = 9376
database = 1</code>

2.2 安装

(1).直接通过命令下载

<code class="language-plaintext hljs">$ go get gopkg.in/ini.v1</code>
(2).通过go mod tidy命映引入
  1. #1.首先,在main.go文件中 import "gopkg.in/ini.v1",如下:
  2. import (
  3. "gopkg.in/ini.v1"
  4. )
  5. #然后命令行执行 go mod tidy

2.3 操作刚才创建的ini配置文件

接下来需要编写 main.go 文件来操作刚才创建的配置文件
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "gopkg.in/ini.v1"
  6. )
  7. func main() {
  8. //演示gopkg.in/ini.v1模块的使用
  9. cfg, err := ini.Load("./conf/app.ini")
  10. if err != nil {
  11. fmt.Printf("Fail to read file: %v", err)
  12. os.Exit(1)
  13. }
  14. // 典型读取操作,默认分区可以使用空字符串表示
  15. fmt.Println("获取配置根数据:", cfg.Section("").Key("app_name").String())
  16. fmt.Println("获取配置mysql数据:", cfg.Section("mysql").Key("password").String())
  17. fmt.Println("获取配置redis数据:", cfg.Section("redis").Key("port").String())
  18. //给ini写入数据
  19. //修改某个值然后进行保存
  20. cfg.Section("").Key("app_name").SetValue("app测试")
  21. //写入一个新的配置
  22. cfg.Section("").Key("app_mode").SetValue("production")
  23. cfg.Section("redis").Key("database").SetValue("1")
  24. cfg.SaveTo("./conf/app.ini")
  25. r.Run() // 启动一个web服务
  26. }

[上一节][golang gin框架] 8.Gin GORM原生 SQL以及表关联查询

[下一节][golang gin框架] 10.Gin 商城项目介绍

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42802
推荐阅读
相关标签
  

闽ICP备14008679号