提交保存,要做重复请求拦截,避免出现重复保存的问题

**问题:**前端ajax提交数据的时候,当频繁点击的时候,或者两个账号以相同数据创建的时候,会出现问题。

**处理办法:**前端拦截,防止重复提交数据,在上一次请求返回结果之后才允许提交第二次;后端和数据库也同意做拦截判断。

** 1. 前端拦截:**

结合 layer.confirm 可以屏蔽掉重复点击确认按钮产生重复请求的情况。

javascript 复制代码
// 创建征地补差价协议
function createDisparityContract() {
    if ($('#areaId').val() == null || $('#areaId').val() == '') {
        layer.msg('请先选择区域');
        return;
    }

    var lock = false;
    layer.confirm("确认要创建土地补差价协议书吗?", {
        btn: ['确定', '取消']
    }, function () {
        if (!lock) {
            lock = true;
            $.ajax({
                type: 'POST',
                data: {
                    areaId: $("#areaId").val()
                },
                async: false,
                url: prefix + '/saveDisparityContract',
                success: function (r) {
                    if (r.code == 0) {
                        reLoad();
                    }
                    layer.alert(r.msg);
                }
            });
        }
    });

}

2. 后端+数据库拦截:

因为会设计协议表,数据表,关系表,而关系表的数据ID字段是唯一的,所以可以给数据ID字段添加唯一索引。后端的的逻辑加上事务管理,这样你无论如何也不可能生成相同的协议书了。

sql 复制代码
ALTER TABLE `biz_contract_offset` ADD unique(`offset_id`);
java 复制代码
@Override
@Transactional
public void insertContractForAll(ContractDO contractDO, Long[] offsetIds) {
    OffsetDataDO offsetDataDO = offsetDataService.get(offsetIds[0]);
    contractDO.setAreaId(offsetDataDO.getAreaId());
    contractDO.setProjectId(offsetDataDO.getProjectId());
    Long rootAreaId = demolitionAreaService.getRootAreaId(contractDO.getAreaId());
    contractDO.setRootAreaId(rootAreaId);
    List<OffsetDataDO> offsetDataList = offsetDataService.getOffsetDataList(offsetIds);
    double price = this.calContractPrice(offsetDataList);
    double buildOfficePrice = this.calContractBuildOfficePrice(offsetDataList);
    contractDO.setPrice(price);
    contractDO.setBuildOfficePrice(buildOfficePrice);
    // 设置合同编号、序号
    this.setContractNo(contractDO, rootAreaId);
    contractDO.setCreateTime(new Date());
    this.save(contractDO);
    contractOffsetService.createContractOffset(contractDO.getId(), offsetIds);
}

.
感谢您的阅读,欢迎参观我的个人网站:小嗨词典【 https://www.happydict.cn】

.

相关推荐
无休居士2 个月前
接口幂等性和并发安全的区别?
并发安全·幂等性
张子行的博客5 个月前
接口幂等性设计(5 大方案罗列)
幂等性·接口设计·接口防重
柠檬茶五元6 个月前
get和post的区别,二者是幂等的吗?
运维·服务器·get·post·幂等性
路过秋天9 个月前
开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本
幂等性
来自宇宙的曹先生9 个月前
哪些场景需要考虑到幂等性?
幂等性·分布式系统
我是一盘牛肉9 个月前
【从零开始学习重要知识点 | 第一篇】快速了解什么是幂等性以及常见解决方案
开发语言·学习·微服务·架构·幂等性
指挥部在下面1 年前
Rabbitmq消息重复消费问题(幂等性保障)
rabbitmq·幂等性·重复消费
tobebetter95271 年前
幂等性(防重复提交)
java·幂等性
xuxu11161 年前
面试题:接口幂等性是什么?如何设计?
java·面试题·接口幂·幂等性