添加两个不同账户时出现重复记录的技术问题求助
解决添加不同账户时重复生成记录的问题
核心原因推测
从现象(添加不同账户生成4条重复记录、添加相同账户无异常)来看,大概率是前端提交逻辑重复触发或后端批量处理时数据集重复导致,以下是具体排查和修复方案:
前端排查与修复(针对JSP页面及联动逻辑)
1. 检查按钮点击事件是否重复绑定
如果账户下拉框的联动逻辑每次触发时都重新绑定Update按钮的点击事件,会导致点击一次触发多次提交。解决方式是绑定前先解绑旧事件:
// 联动逻辑中绑定提交事件时,先清除旧事件 $('#updateBtn').off('click').on('click', function(e) { e.preventDefault(); // 执行表单提交逻辑 });
2. 禁用按钮防止重复提交
点击Update后立即禁用按钮,避免用户误操作或浏览器重试导致的重复提交,同时改用AJAX提交替代原生表单提交,彻底规避页面重载时的浏览器自动重试问题:
$('#updateBtn').on('click', function(e) { e.preventDefault(); const $btn = $(this); $btn.prop('disabled', true); $.post('your-update-url', $('form').serialize(), function(res) { // 提交成功后刷新页面或更新列表 location.reload(); }).always(function() { // 无论成功失败,恢复按钮状态 $btn.prop('disabled', false); }); });
3. 检查联动逻辑的DOM操作
确认选择新账户时,是否重复克隆了表单行、添加了重复的输入字段,导致提交时携带多组账户数据。可以在联动逻辑执行后,打印表单序列化数据排查:
// 账户选择事件触发后,打印表单数据 console.log($('form').serialize());
如果输出中包含重复的账户、站点字段,说明DOM操作存在重复添加问题,需要清理旧表单数据或避免重复插入DOM元素。
后端排查与修复(针对doUpdate()方法)
1. 添加幂等性校验
给每个提交请求生成唯一标识(如前端生成UUID),后端校验该标识是否已处理,避免重复执行插入逻辑:
public void doUpdate(HttpServletRequest request) throws Exception { String requestId = request.getParameter("requestId"); // 从数据库/缓存中检查requestId是否已处理 if (requestIdService.isProcessed(requestId)) { // 已处理过,直接返回 return; } // 标记该请求已处理 requestIdService.markAsProcessed(requestId); // 执行记录插入逻辑 transactionService.saveTransactions(formData); }
2. 检查批量插入的数据集
如果doUpdate()是批量处理前端传来的多组账户数据,确认是否遍历了重复的数据集。可以在方法开头打印数据集大小排查:
System.out.println("待处理的记录数:" + formDataList.size());
如果输出是4,说明前端传来了重复数据;如果是2但插入了4条,说明插入逻辑内部存在重复执行的分支。
3. 改用PRG模式避免页面重载重试
如果必须用原生表单提交,后端处理完成后重定向到结果页面,而非直接返回原页面,避免浏览器刷新时重复发送POST请求:
public void doUpdate(HttpServletRequest request, HttpServletResponse response) throws Exception { // 执行插入逻辑 transactionService.saveTransactions(formData); // 重定向到列表页面,避免刷新重复提交 response.sendRedirect("transaction-list.jsp"); }
验证步骤
- 打开浏览器开发者工具的网络面板,点击
Update后查看请求数量:- 如果是2次请求:前端提交逻辑重复,按前端方案修复;
- 如果是1次请求但插入4条:后端逻辑有问题,按后端方案排查。
- 对比不同账户和相同账户的请求参数,查看是否存在参数格式或数量的差异,定位触发重复的具体条件。
内容的提问来源于stack exchange,提问作者ackbNow
相关产品推荐
相关产品推荐

