以注解的形式对接口进行并发控制
背景:项目中有一个按二级大类批量更改配置的操作,但是还不能直接以update的形式进行更改,必须先假删除,再insert,并且在删除之前有一个select,对查出来的数据进行遍历。
导致的问题:事务时间长,会出现dubbo超时,导致数据库完成更新,前端显示系统异常,给用户一个操作失败的错觉
解决方案:异步操作数据库,直接给前端返回,以牺牲结果正确性保证,来换取一个友好的交互。
此方案还是有一个问题,当数据库还未更新完成时,用户查询时查不到最新修改的,导致用户以为更新失败再次更改,无形中增加了不必要的重复更新操作
解决方案:给哪些有上述问题的接口添加一个并发控制,比如此接口一分钟之内只允许更改一次,此方案并不能保证用户的每一次操作,数据库都会成功更新,只是对这种批量的操作设置得更人性化一点,只是在保护服务器
以下给出代码:
一:基础类的创建
1、创建使用在Controller类上的注解
2、创建使用在方法上的注解(前提是该方法所在的类使用了步骤一中的注解)
3、创建每个控制点的实体类(红框部分大家可以思考一下为什么要重写)
4、创建一个被禁止访问的一个友好提示,这里建了一个实体类
以上完成了一些基本的类和注解的创建,接下来就是如何去实现了
二、业务实现
1、思路分析,既然是对每个接口的访问,那我们就要考虑如何把控制权放在接口的上层(具体哪一层可以根据项目择优选择),因为controller的上层肯定知道本次请求要访问哪个handler(既,哪个接口),我在项目中把控制权放在了拦截器层面
2、以下列出我的业务实现
拦截器的实现
setApplicationContext方法的实现
拦截器工具类的方法有两个
最后配置一下拦截器到配置文件里, <mvc:interceptors></mvc:interceptors>里可以配置多个拦截器
注意事项:
1、控制点事控制接口的访问的,不是控制按钮点击的,所以要注意一些情况,比如:你对一个修改和一个查询做了并发控制,但是通常修改完后会自定调取查询接口,所以要注意隐藏的一些调用
2、注意拦截器的执行顺序