行数据上加一个version版本字段,可以有效防止数据重复更新

简介: 行数据上加一个version版本字段,可以有效防止数据重复更新

有时候,可能因为编码上的一些漏洞被利用,导致代码部分的check失效,一些重复请求会同时更新一条数据,导致出现问题。在行数据上加一个 version 版本字段,可以为程序加上最后一道屏障。


原理是什么呢?


第一,更新数据之前先获取行数据的版本 version;

第二,重复请求第一次,更新行数据,version+1;

第三,重复请求第二次,判断 version ≠ version,报错。


具体的做法。


第一步,增加 version 版本字段。

image.png



第二步,更新数据之前获取版本。


long version = select version from test where id = 1;


PS:代码是模拟的。


第三步,更新数据的时候(Mybatis)增加 where 条件 version = #{version},并且更新 version 字段。


update test money=money+#{money},version=version+1 where id = 1 and version = #{version}


整体的思路非常简单,但是对数据的安全性保护却非常有效。如果没有 version 字段保护,那么当重复请求逃过代码的检查时,数据库就会更新出错。但是有了 version 字段保护后,重复数据就被拒之门外了。


防止重复数据的第一步:jQuery 禁用表单提交按钮,防止用户请求重复提交


相关文章
解决Mybatis-Plus更新对象时为法将某字段更新为空值的问题
解决Mybatis-Plus更新对象时为法将某字段更新为空值的问题
解决Mybatis-Plus更新对象时为法将某字段更新为空值的问题
|
3月前
|
关系型数据库 MySQL 数据库
mysql,归零,无法自动排序,删除id,表单的数据没有从零开始出现怎样解决?删除数据仍然从删除的地方该怎样解决?表单的数据没有从2开始,而是从之前的删除的序号开始自增。
mysql,归零,无法自动排序,删除id,表单的数据没有从零开始出现怎样解决?删除数据仍然从删除的地方该怎样解决?表单的数据没有从2开始,而是从之前的删除的序号开始自增。
|
5月前
|
NoSQL MongoDB 数据库
通过优化索引以消除 MongoDB 中的 "查询目标已超过1000个扫描对象/返回的文档数" 警告
MongoDB NoSQL数据库在处理复杂查询时可能出现“查询目标已超过1000个扫描对象/返回的文档数”警告。文章分析了该问题,展示了一个示例集合和相关索引,并提供了查询示例。通过`explain`命令发现查询未有效利用索引。解决方案是遵循ESR规则,创建新索引从而优化查询并消除警告。
137 1
|
5月前
|
SQL Java 数据库连接
Mybatis Plus字段为空值时未更新解决方案
Mybatis Plus字段为空值时未更新解决方案
566 1
|
5月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
65 0
|
12月前
|
Linux 开发工具 开发者
上传ipa报错版本号重复问题,修改版本号
上传ipa报错版本号重复问题,修改版本号
|
easyexcel
EasyExcel低版本中数据行中包含空数据会跳过导致数据对应不上的问题解析
EasyExcel低版本中数据行中包含空数据会跳过导致数据对应不上的问题解析
439 0
|
人工智能
ES中更新字段和删除字段的操作
ES中更新字段和删除字段的操作
|
数据采集 JSON 数据格式
一日一技:如何处理配置文件中的重复值?
一日一技:如何处理配置文件中的重复值?
118 0
|
Java 数据库连接 数据库
Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查...
Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查...
159 0
下一篇
无影云桌面