美文网首页MyBatis+SpringMVC+SpringBootjava学习
以注解的形式对接口进行并发控制

以注解的形式对接口进行并发控制

作者: plugins | 来源:发表于2018-08-16 18:03 被阅读12次

    背景:项目中有一个按二级大类批量更改配置的操作,但是还不能直接以update的形式进行更改,必须先假删除,再insert,并且在删除之前有一个select,对查出来的数据进行遍历。

    导致的问题:事务时间长,会出现dubbo超时,导致数据库完成更新,前端显示系统异常,给用户一个操作失败的错觉

    解决方案:异步操作数据库,直接给前端返回,以牺牲结果正确性保证,来换取一个友好的交互。

    此方案还是有一个问题,当数据库还未更新完成时,用户查询时查不到最新修改的,导致用户以为更新失败再次更改,无形中增加了不必要的重复更新操作

    解决方案:给哪些有上述问题的接口添加一个并发控制,比如此接口一分钟之内只允许更改一次,此方案并不能保证用户的每一次操作,数据库都会成功更新,只是对这种批量的操作设置得更人性化一点,只是在保护服务器

    以下给出代码:

    一:基础类的创建

    1、创建使用在Controller类上的注解

    2、创建使用在方法上的注解(前提是该方法所在的类使用了步骤一中的注解)

    3、创建每个控制点的实体类(红框部分大家可以思考一下为什么要重写)

    4、创建一个被禁止访问的一个友好提示,这里建了一个实体类

    以上完成了一些基本的类和注解的创建,接下来就是如何去实现了

    二、业务实现

    1、思路分析,既然是对每个接口的访问,那我们就要考虑如何把控制权放在接口的上层(具体哪一层可以根据项目择优选择),因为controller的上层肯定知道本次请求要访问哪个handler(既,哪个接口),我在项目中把控制权放在了拦截器层面

    2、以下列出我的业务实现

    拦截器的实现

    setApplicationContext方法的实现

    拦截器工具类的方法有两个

    最后配置一下拦截器到配置文件里,  <mvc:interceptors></mvc:interceptors>里可以配置多个拦截器

    注意事项:

    1、控制点事控制接口的访问的,不是控制按钮点击的,所以要注意一些情况,比如:你对一个修改和一个查询做了并发控制,但是通常修改完后会自定调取查询接口,所以要注意隐藏的一些调用

    2、注意拦截器的执行顺序

    相关文章

      网友评论

        本文标题:以注解的形式对接口进行并发控制

        本文链接:https://www.haomeiwen.com/subject/jqdnbftx.html