MyBatis+SpringMVC+SpringBootjava学习

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

2018-08-16  本文已影响12人  plugins

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

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

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

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

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

以下给出代码:

一:基础类的创建

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

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

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

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

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

二、业务实现

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

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

拦截器的实现

setApplicationContext方法的实现

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

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

注意事项:

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

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

上一篇下一篇

猜你喜欢

热点阅读