Copyright © 2022-2025 aizws.net · 网站版本: v1.2.6·内部版本: v1.25.2·
页面加载耗时 0.00 毫秒·物理内存 126.8MB ·虚拟内存 1372.9MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
通过 db.Transaction 函数实现事务,如果闭包函数返回错误,则回滚事务。
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
})
在开发中经常需要数据库事务来保证多个数据库写操作的原子性。例如电商系统中的扣减库存和保存订单。
// 开启事务
tx := db.Begin()
// 在事务中执行数据库操作,使用的是tx变量,不是db。
// 库存减一
// 等价于: UPDATE `foods` SET `stock` = stock - 1 WHERE `foods`.`id` = '2' and stock > 0
// RowsAffected用于返回sql执行后影响的行数
rowsAffected := tx.Model(&food).Where("stock > 0").Update("stock", gorm.Expr("stock - 1")).RowsAffected
if rowsAffected == 0 {
// 如果更新库存操作,返回影响行数为0,说明没有库存了,结束下单流程
// 这里回滚作用不大,因为前面没成功执行什么数据库更新操作,也没什么数据需要回滚。
// 这里就是举个例子,事务中可以执行多个sql语句,错误了可以回滚事务
tx.Rollback()
return
}
err := tx.Create(保存订单).Error
// 保存订单失败,则回滚事务
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
Gorm框架 关联查询 属于:Gorm 的关联查询(又叫连表查询)中的“属于”关系是一对一关联关系的一种,通常用于描述一个 Model属于另外一个 Model。外键:在关联查询中必须包含外键,默认 gorm 使用(关联属性类型 + 主键)组成外键名,如上面的例子 User + ID 组成 UserID,UserID 就作为 Profile 的外键。