[go-每日一库]golang-gorm的事务处理(五)

原文链接:
1.(八)GORM事务处理 https://www.cnblogs.com/infodriven/p/16351565.html

1.自动事务

通过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
})

2.手动事务

在开发中经常需要数据库事务来保证多个数据库写操作的原子性。例如电商系统中的扣减库存和保存订单。
gorm事务用法:

// 开启事务
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()
}

posted on   进击的davis  阅读(1282)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示