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

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

原理是什么呢?

第一,更新数据之前先获取行数据的版本 version;
第二,重复请求第一次,更新行数据,version+1;
第三,重复请求第二次,判断 version ≠ version,报错。

具体的做法。

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

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

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 禁用表单提交按钮,防止用户请求重复提交


好了各位读者朋友们,以上就是本文的全部内容了。能看到这里的都是人才,二哥必须要为你点个赞👍。如果觉得不过瘾,还想看到更多,可以查看我的个人博客。如果你有什么问题需要我的帮助,或者想喷我了,欢迎留言哟。

养成好习惯!如果觉得这篇文章有点用的话,求点赞、求关注、求分享、求留言,这将是我写下去的最强动力!

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以帮你回答这个问题。 首先,我们需要创建一个工具类,用于获取版本号和更新版本号。以下是一个简单的示例: ```java @Component public class VersionUtils { private static final String VERSION_KEY = "version"; @Autowired private RedisTemplate<String, String> redisTemplate; public int getVersion(String key) { String version = redisTemplate.opsForHash().get(key, VERSION_KEY); return version != null ? Integer.parseInt(version) : 0; } public void updateVersion(String key) { redisTemplate.opsForHash().increment(key, VERSION_KEY, 1); } } ``` 这个工具类使用 Redis 存储每个数据版本号,可以根据键名获取版本号,也可以更新版本号。需要注意的是,这里使用了 Spring 的依赖注入,因此需要在配置文件中添加 RedisTemplate 的 Bean。 接下来,我们可以在实体类中添加版本字段,如下所示: ```java public class User { private Long id; private String name; private Integer age; private Integer version; // getter 和 setter 方法省略 } ``` 在实现数据更新时,只需要先获取当前数据版本号,然后更新数据更新版本号即可。以下是一个简单的示例: ```java @Service public class UserService { @Autowired private VersionUtils versionUtils; @Autowired private UserMapper userMapper; @Transactional public void updateUser(User user) { int oldVersion = versionUtils.getVersion("user_" + user.getId()); user.setVersion(oldVersion + 1); userMapper.updateUser(user); versionUtils.updateVersion("user_" + user.getId()); } } ``` 这个示例中,我们首先获取了当前用户的版本号,然后更新用户数据更新版本号。需要注意的是,这里使用了 Spring 的事务管理,以确保数据更新版本更新是原子操作。 这就是一个简单的实现方式,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默王二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值