提交执行二次动作

本文讲述了在一个项目中遇到的重复提交问题。原本一个操作被执行两次,修改需求后导致数据被错误地插入数据库两次。通过排查发现是因为JavaScript验证后再次触发了form.submit()导致的问题。

  在公司做的一个项目中,以前日志也留意到某一个action执行了二次。当时没太在意这个问题。

后来修改需求了,需要这个action提交数据到数据库(以前都是查询的)。导致向数据库插入二条数据。开始一直以为代码有问题。但怎调试都找不到原因!!!。后来通过google查找得到提示。再看看自己的页面发现了原因所在,就是我的提交按钮类型是submit的。但我做了javascript验证,在javascript里面再一次用了form,submit()的动作!。导致form提交发二次。

PS:到底为什么会执行二次,还是不太明白,谁知道的告诉我`````

  55555~~~~,真不应该犯这样的错。写出来作为对自己的一种警示吧。

### TXC 分布式事务二次提交解决方案及原理 TXC(Taobao Transaction Constructor)是阿里巴巴早期推出的分布式事务解决方案之一,主要用于解决跨服务调用中的数据一致性问题。虽然 TXC 已被 Seata 取代,但其核心理念仍然具有借鉴意义。 #### 一、TXC 的基本工作流程 TXC 使用的是二阶段提交协议(2PC, Two Phase Commit)。具体分为两个阶段: 1. **准备阶段 (Prepare)** 所有参与节点执行业务逻辑并锁定资源,但不真正提交更改。此阶段完成后,所有参与者需准备好确认或取消事务。 2. **提交/回滚阶段 (Commit/Rollback)** 如果所有参与者均成功完成 Prepare,则由协调者发起全局提交;若有任意一个参与者失败,则触发全局回滚。 --- #### 二、TXC 中的二次提交问题及其原因分析 在实际生产环境中,可能会因网络异常或其他不可控因素导致某些参与者未能及时接收到最终的提交指令,从而引发所谓的“二次提交”问题。以下是可能的原因: - **网络分区**:当协调者发出提交命令后,由于网络中断等原因,部分参与者未收到该消息,后续重试可能导致重复提交尝试[^1]。 - **幂等性缺失**:如果参与者缺乏良好的幂等设计,在多次接收相同提交请求时容易造成冗余操作[^3]。 --- #### 三、TXC 对于二次提交问题的解决方案 针对上述情况,TXC 提供了几种策略来应对潜在风险: ##### 1. **引入唯一标识符** 通过为每次事务分配唯一的全局 ID (Global Session ID 和 Branch Session ID),可以有效区分不同的事务实例以及同一次事务的不同阶段动作。这样即使发生重复提交请求,也可以基于这些标识快速判断当前状态是否已处理完毕而无需再次执行实质性变更[^2]。 ##### 2. **增强幂等控制机制** 确保每个分支事务具备高度可靠的幂等特性至关重要。这意味着即便同一个提交指令被执行多次,也只会产生预期的一次效果。例如: - 在数据库层面实现更新语句带有条件约束; - 利用 Redis 等缓存工具保存临时标志位用于校验重复请求。 ```sql -- SQL 示例:带条件更新以保障幂等性 UPDATE order_table SET status='COMMITTED' WHERE id=1 AND status='PREPARED'; ``` ##### 3. **超时检测与补偿措施** 考虑到极端情况下仍可能存在遗漏的情况,TXC 还设置了合理的等待时间窗口期。超过指定时限仍未得到反馈的信息会被标记为可疑状态,并启动人工干预或者自动化修复脚本进行补救[^2]。 ##### 4. **日志记录与审计追踪** 全程详尽的日志体系对于排查错误根源尤为重要。无论是正常路径还是异常恢复过程都需要保留足够的上下文信息以便事后审查验证正确性。 --- #### 四、其他相关技术对比 除了传统的 XA 协议外,还有 TCC 方案作为另一种替代选择适用于特定场景下的高性能需求应用开发当中。相比而言,TCC 更加灵活但也增加了编码复杂度;而对于新兴框架如 Seata,则综合吸收了两者优点进一步优化用户体验[^3]。 --- ### 结论 综上所述,尽管存在一定的挑战,但是借助恰当的设计模式和技术手段完全可以克服 TXC 分布式事务中可能出现的二次提交隐患。合理运用唯一标识管理、强化幂等保护能力再加上必要的监控报警系统共同构成了完整的防护屏障。 --- 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值