gorm事务控制

gorm事务控制

创建表

type Public struct {
	gorm.Model
	Name string
}

func CreateTables() {
	db.AutoMigrate(&Public{})
}

手动控制事务

func test1() {
	public := Public{
		Name: "krien",
	}
	// 手动控制
	tx := db.Begin()
	tx.Create(&public)
	err := tx.Create(nil).Error
	if err != nil {
		tx.Rollback()
	} else {
		tx.Commit()
	}
}

使用事务控制

要在事务中执行一系列操作,一般流程如下:

func test2() {
// 要在事务中执行一些db操作(从这里开始你应该使用“tx”,而不是“db”)
	db.Transaction(func(tx *gorm.DB) error {
		public := Public{
			Name: "krien",
		}
		if err := tx.Create(&public).Error; err != nil {
			// 返回任何错误都会回滚事务
			return err
		}
		public2 := Public{
			Name: "kite",
		}
		if err2 := tx.Create(&public2).Error; err2 != nil {
			return err2
		}
		// 返回nil提交事务
		return nil
	})
}

嵌套事务

GORM支持嵌套事务,您可以回滚较大事务内执行的一部分操作

func test3() {
	db.Transaction(func(tx *gorm.DB) error {
		tx.Create(&public1)

		tx.Transaction(func(tx2 *gorm.DB) error {
			tx2.Create(&public2)
			return errors.New("roll back public2")
		})
		tx.Transaction(func(tx2 *gorm.DB) error {
			tx2.Create(&public3)
			return nil
		})
		return nil
	})
}

SavePoint 和 RollbackTo

通过SavePoint可以设置保存点,用RollbackTo可以回滚到设置的保存点

func test4 (){
	tx := db.Begin()
	tx.Create(&user1)

	tx.SavePoint("sp1")
	tx.Create(&user2)
	tx.RollbackTo("sp1")  // Rollback user2

	tx.Commit() // Commit user1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值