Gorm 0值不更新的问题

我有一张用户表,用户表里面的一个字段叫做points 积分,表示用户当前的剩余积分数据的。每当使用积分兑换物品,积分就会减少。

// 用户表
type User struct {BaseModelAccount     string `json:"account" form:"account" binding:"required" gorm:"column:account;type:varchar(64);not null;comment:账号,默认同TapId;"`   //账号(同ID)Password    string `json:"password" form:"password" binding:"required" gorm:"column:password;type:varchar(64);default:'666666';comment:密码;"` //密码,默认666666Mobile      string `json:"mobile" form:"mobile" gorm:"column:mobile;size:32;default:'';comment:手机号;"`                                        //手机号,非必须Nickname    string `json:"nickname" form:"nickname" gorm:"column:nickname;size:64;default:'';comment:昵称;"`                                   //手机号,非必须QQID        string `json:"qq_id" form:"qq_id" gorm:"size:128;default:'';comment:QQID;"`                                                      //QQ ID(非必须)WechatID    string `json:"wechat_id" form:"wechat_id" gorm:"size:128;default:'';comment:微信ID;"`                                              //微信ID(非必须)Points      int64  `json:"points" form:"points" gorm:"default:0;comment:广告积分;"`                                                              //当前广告积分,默认0TotalPoints int64  `json:"total_points" form:"total_points" gorm:"default:0;comment:总积分;"`                                                   //总共获得的广告积分,默认0
}

代码是这么写的

user.Points -= totalNeedPoints
Model.GetDB().Updates(&user)

使用掉积分,然后保存到数据库中,看起来没有问题

问题是这么发生的:

最近,追踪日志发现,一个用户的积分变化是这样的。

做了A,+100 积分

做了B,+ 200 积分

然后兑换了C,-300积分

然后做了D,+100积分。这时候发现,用户的剩余积分居然是400?!!!

经过定位分析,代码就出现在上面的那两行,后面优化成下面的代码

data := make(map[string]interface{})
data["points"] = user.Pointserr = Model.GetDB().Model(&Model.User{}).Where("id = ?", user.Id).Updates(data)

终于正常了!

原因复盘: 使用go语言的gorm库时,如果值为0,直接执行Updates更新模型,是不会保存到数据库里面去了。这样就会导致重复刷积分的漏洞出现。

加个标记,大家一起学习避坑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MOS管驱动电流计算以及分立器件驱动电路

自记: 1.先根据mos数据手册查找参数,计算电流; 2.分立器件驱动电路图; 3.分立器件选择 仔细学,能看懂! 1.计算电流: 2.分立器件驱动电流:两种,第一种反向&#xff0c…

什么是TestNG以及如何创建testng.xml文件?

目录 什么是TestNG? 如何创建testng.xml文件 手动创建testng.xml 通过testng.xml运行整个包 通过testng.xml运行类 使用Eclipse创建testng.xml 本文将讨论TestNG以及如何通过执行testng.xml文件在TestNG中运行第一个测试用例。 什么是TestNG? Te…

new/delete vs malloc/free

new是关键字,最后还是调用malloc->brk malloc是函数,调用brk() new 和 malloc 都是用于在程序运行时动态分配内存的方法,但它们有一些重要的区别: 语法: new 是C关键字,用于在堆上分配内存并同时调用对…

线性表小结

线性表小结 单链表、循环链表和双向链表的时间效率比较 顺序表和链表的比较

强化学习11——DQN算法

DQN算法的全称为,Deep Q-Network,即在Q-learning算法的基础上引用深度神经网络来近似动作函数 Q ( s , a ) Q(s,a) Q(s,a) 。对于传统的Q-learning,当状态或动作数量特别大的时候,如处理一张图片,假设为 210 160 3 …

5、电科院FTU检测标准学习笔记-功能检测3-参数配置

———————————————————————————————————— 作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 —————————————————…

C++ 树与图的广度优先遍历 || 模版题 :图中点的层次

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。 所有边的长度都是 1 ,点的编号为 1∼n 。 请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1 。 输入格式 第一行包含两个整数 n 和 m 。 …

Datawhale 大模型基础理论 Day1 引言

开源链接如下:https://github.com/datawhalechina/so-large-lm/blob/main/docs/content/ch01.md 语言模型的概念:即能够赋予每个有意义的词(token)以一定的概率的一个函数的集合。 语言模型可以被用来评估输入的质量&#xff0c…

加密经济学:Web3时代的新经济模型

随着Web3技术的迅猛发展,我们正迈入一个全新的数字经济时代。加密经济学作为这一时代的核心,不仅在数字货币领域崭露头角,更是重新定义了传统经济模型,为我们开启了一个充满创新和机遇的新纪元。 1. 去中心化的经济体系 Web3时代…

7.3 CONSTANT MEMORY AND CACHING

掩模数组M在卷积中的使用方式有三个有趣的属性。首先,M阵列的大小通常很小。大多数卷积掩模在每个维度上都少于10个元素。即使在3D卷积的情况下,掩码通常也只包含少于1000个元素。其次,在内核执行过程中,M的内容不会改变。第三&am…

启动Vue项目,报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

前言: 最近在打开一个Vue项目的时候,打开之后输入命令行:npm run serve之后发现,报错:vue-cli-service 不是内部或外部命令,也不是可运行的程序,以下是解决方案: 报错图片截图&…

HNU-算法设计与分析-实验3

算法设计与分析实验3 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验31 用Dijkstra贪心算法求解单源最短路径问题问题重述证明模板&#xff1a;Dijkstra算法代码验证算法分析 1【扩展】 使用堆优化的Dijkstra原因代码算法分析验证 2 回溯法求解…

运筹说 第98期|无约束极值问题

上一期我们一起学习了关于非线性规划问题的一维搜索方法的相关内容&#xff0c;本期小编将带大家学习非线性规划的无约束极值问题。 下面&#xff0c;让我们从实际问题出发&#xff0c;学习无约束极值问题吧&#xff01; 一、问题描述及求解原理 1 无约束极值问题的定义 无约…

【工作】靠谱做事,把事情做闭环

文章目录 1、什么是工作靠谱2、如何成为一个靠谱的人&#xff1f;3、把事情做闭环4、永不说NO5、主动管理 1、什么是工作靠谱 工作靠谱通常指一个人在工作中表现出的可靠性和稳定性。这包括但不限于以下几个方面&#xff1a; 执行力强&#xff1a;能够按时完成工作任务&#x…

ArkUI-X跨平台已至,何需其它!

运行环境 DevEco Studio&#xff1a;4.0Release OpenHarmony SDK API10 开发板&#xff1a;润和DAYU200 自从写了一篇ArkUI-X跨平台的文章之后&#xff0c;好多人都说对这个项目十分关注。 那么今天我们就来完整的梳理一下这个项目。 1、ArkUI-X 我们之前可能更多接触的…

登录验证

目录 会话技术 Cookie Session JWT JWT生成 JWT校验 会话技术 会话 打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求与响应 会话跟踪 一种维护浏览器的方法 服务器需要…

性能测试jmeter

选的这些怎么添加 在一个列表里面 方法调用${__time(YMD)} 两个下划线&#xff0c;后跟函数名&#xff0c;小括号内是输入参数&#xff0c;整个用大括号包裹。 注意POST一定要在消息体数据里面写,不能再参数里面 否则报错:loginOut,没cookie等

VueCli-自定义创建项目

参考 1.安装脚手架 (已安装可以跳过) npm i vue/cli -g2.创建项目 vue create 项目名 // 如&#xff1a; vue create dn-demo键盘上下键 - 选择自定义选型 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > M…

数据管理系统-week6-数据定义语言(DDL)

文章目录 前言一、CREATE TABLE statement数据类型补充二、DROP TABLE statement三、ALTER TABLE statement添加属性删除属性更改属性的类型添加约束四、练习题前言 本节课主要学习如何创建表,删除表,更改表,以及一道简单的练习题,提供给大家学习与参考 一、CREATE TABLE …

动态规划Day08(背包结束,未写完)

139.单词拆分(需要重新写) 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重…