gorm中使用事务的2种方法 Transaction和Begin的使用详解

3 篇文章 0 订阅

在gorm这个orm框架中,我们可以通过 .Transaction方法开启一个自动事务,可以通过.Begin方法开启一个手动事务。

所谓的自动事务就是在整个事务的执行过程中如果用到错误他会自动帮你回滚数据, 而手动事务就需要你自己手动回滚数据。

一、Transaction自动事务使用

在gorm中使用Transaction方法开启的事务实际上就是一个闭包函数,我们先来看看这个方法的原型定义: func (db *gorm.DB) Transaction(fc func(tx *gorm.DB) error, opts ...*sql.TxOptions) (err error)

可见这个方法可以有2个参数,第一个就是你的事务执行的闭包函数,第二个参数为可选参数,是一些事务的选项(一般情况下不用)。

我们可以直接在Transaction方法后面跟一个匿名函数func(tx *gorm.DB) error , 然后将我们要执行的事务放到这个函数里面即可, 注意这个函数的参数类型必须是 *gorm.DB, 而且返回只有一个参数就是error异常信息。

注意通过Transaction开启的自动事务是不需要你手动执行Commit() 提交事务 和Rollback()回滚事务的, Commit()方法会在闭包函数执行完毕后自动执行, Rollback()方法会在闭包中有异常时自动执行。 

示例:

err := db.Transaction(func(tx *gorm.DB) error {
		
	// 你要执行事务的代码。。。。。  注意这里必须使用参数tx  返回 err
	
    err:=tx.Table("sys_user").Create(&user).Error
    if err!=nil{
    	return err
    }

    err = tx.Table("sys_role").Update("uid",user.Id).Error
    return err
})

注意上面的闭包中的事务必须要使用参数里面的tx,闭包里面的返回是err,如果有异常gorm会自动帮我们回滚数据, 当然,在这个闭包里面你还可以再度开启事务,即嵌套事务,方法一样。

二、Begin方法开启手动事务

这个手动事务就是有异常需要你自己手动执行Commit() 提交事务 和Rollback()回滚事务的事务。

如果我们的某个函数或者方法里面都是需要执行的事务, 我们可以将这个Rollback方法的执行通过 defer语法+recover函数 的方式通过栈加函数异常捕获的方式来触发我们的事务的回滚操作。 

示例:

1.普通方式的手动事务

tx := db.Begin() // 开启事务

// 要执行的事务 ,注意使用上面的 tx来操作数据库, 如  tx.Table("xxx").xxx

if err!=nil {
    tx.Rollback() //手动回滚
}

tx.Commit() //手动提交事务

2.使用defer+recover函数来自动执行函数基本的事务回滚

func CreateAnimals(db *gorm.DB) error {
	// 再唠叨一下,事务一旦开始,你就应该使用 tx 处理数据
	tx := db.Begin() //开启事务
	defer func() {
		// 捕获函数异常
		if r := recover(); r != nil {
			tx.Rollback() // 如果有异常,执行回滚事务
		}
	}()

	if err := tx.Error; err != nil {
		return err
	}
	// 你的事务代码......

	if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
		return err // 这个地方不需要执行Rollback,返回异常会被defer里面的recover函数捕获 然后会自动执行Rollback
	}
	return tx.Commit().Error // 提交事务
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值