后端怎样防止重复提交订单？
一般我们都是这样做的： 创建订单的时候，用订单信息计算一个哈希值，判断redis中是否有key，有则不允许重复提交，没有则生成一个新key，放到redis中设置个过期时间，然后创建订单。其实就是在一段时间内不可重复相同的操作 第二种方式：利用唯一索引机制的验证 需要原子性操作，想到了数据库的唯一索引。新建一个TradeLock表： ● 每次request进来则往表里面插入数据： 成功，则可以继续操作（相当于获取锁）； 失败，则说明有操作在进行。 ● 操作完成后，删除此条记录。（相当于释放锁）。 第二种方法(利用数据库完整性约束)最简便,但是会访问(读写)数据库,给数据库造成一定的压力;同时也有个隐患,程序执行中途故障了(网络垮了,服务宕了...),后面重复提交,就无法成功了 也有解决方法:定时器清理这个hash数据库表 第三种方式：利用redis的setNX 第四种方式：利用redis的分布式锁（同上setNx命令 如果是防重设计，流程图要改改： 1.自定义注解 2.使用AOP实现该注解 3、测试 在更新数据之前先查询一下数据： 如果数据存在，假设查到的version等于1，再使用id和version字段作为查询条件更新数据： 更新数据的同时version+1，然后判断本次update操作的影响行数，如果大于0，则说明本次更新成功，如果等于0，则说明本次更新没有让数据变更。 由于第一次请求version等于1是可以成功的，操作成功后version变成2了。这时如果并发的请求过来，再执行相同的sql：  该update操作不会真正更新数据，最终sql的执行结果影响行数是0，因为version已经变成2了，where中的version=1肯定无法满足条件。但为了保证接口幂等性，接口可以直接返回成功，因为version值已经修改了，那么前面必定已经成功过一次，后面都是重复的请求。 具体流程如下：  创建订单服务，可通过预生成订单号，然后利用DB的订单号唯一约束，避免重复写入订单，实现创建订单服务的幂等性 更新订单服务，通过一个版本号机制，每次更新数据前校验版本号，更新数据同时自增版本号，这样的方式，来解决ABA问题，确保更新订单服务的幂等性 对于重复提交请求的问题，我们单纯的只从前端或后端控制，带来的用户体验都不是最好的。只有两者结合起来，才能在确保功能正常的前提下，保证用户体验效果。 PS：如果想学习技术，或者在学习技术的过程中有疑问，对编程方向的选择，可以来这里找小于哥，一个有思想有规划，被代码延误的心灵导师，可咨询offer的选择，职业规划，学习路线，技术开发中的问题 我是终端研发部的小于哥 @终端研发部 天专注技术开发小技巧，技术教程进阶，职场经验，面试的分享，希望我的回答能够帮助到你哈，笔芯~