ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> 在开发中经常需要数据库事务来保证多个数据库写操作的原子性 ~~~ // 开启事务 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() } ~~~