zoukankan      html  css  js  c++  java
  • mysql设置唯一约束引起的DuplicateKeyException的解决方案(保证提供服务的幂等性)

       DuplicateKeyException: 主键冲突异常

    catch (DuplicateKeyException e) {
                            logger.info("重复请求。feeDetail={}", feeDetail.toString());
                        } 

    最近项目中遇到一个问题,我们提供的一个对外的服务接口在数据库网络层报错DuplicateKeyException,是由于业务方重复调用而业务本不该重复调用,但是我们管不了业务方只能自己调整。

          思路一:

              去掉设置的数据库层的唯一约束,报错是解决了但是会引起后面一系列的问题,肯定是行不通的。

          思路二:

              插入数据之前先判断数据存在否,不存在再插入。但是高并发的情况下还是会存在问题,除非给数据加锁,但是这样复杂度更高并没有必要。

          思路三:

              数据库层面的问题从数据库解决,可以用 insert ignore来解决,insert ignore就表示存在则插入不存在则忽略。

            思路三是很好的解决方法,但是遇到另一个问题,之前我插入之后都是把新生成的id返回回去,insert ignore则不管插入成功与否都会返回这个id,也就是业务逻辑那里并不能确定到底插入成功与否,插入的数据涉及到计算结果,为保证接口的幂等性,之前是在catch住DuplicateKeyException后又做了一些列的逻辑处理来保证接口幂等性。

            现在的问题由数据库报错变成了如何知道数据库是否真正插入数据,这时候想到了ROW_COUNT()来判断数据库的执行结果。

            

           最后业务层根据返回的id是否是0就可以判断数据是否真正插入,到这里问题也就解决了。

  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/cxy2020/p/13522428.html
Copyright © 2011-2022 走看看