场景
在开发工作中由于接口处理数据过慢,导致还没保存到数据库时再次提交相同的数据,此时数据库内没有这条数据出现了重复提交的脏数据
解决办法
1.前端控制提交未返回结果之前按钮禁用
document.getElementById("btn").disabled = true;
(无法避免恶意用户调用接口提交数据,所以前端卡死的办法不是特优)
2.在Java代码增加synchronized关键字使提交数据一条一条执行
public synchronized Result<?> save (Model model){ return null }
(使用起来比较简单但性能很低,在处理数据时会有排队等候的问题,并且在多实例部署时无法起到作用)
3.通过缓存或非关系型数据库比如Redis,Memcached将提交数据通过无法重复的key缓存起来在异步插入到数据库,因为关系型数据库时key,value形式的不会存相同的数据进去
(需要系统内有关系型数据库,没有的话集成进去为了防止重复插入代价太大)
4.通过数据库限制插入
在某个字段限制唯一约束
ALTER TABLE <TABLE> ADD unique(column);
(会有局限性,一般情况下都是多个字段同时相同)
设置联合唯一索引
ALTER TABLE <TABLE> ADD UNIQUE KEY(column,column);
(本人用的这种方法,在重复插入时sql会报异常,捕获异常后返回异常信息)
本人也是菜鸟一枚,如有错误还望指出,谢谢各位大牛