并发防止重复提交

项目中遇到了服务器接口重复被调用的情况,导致数据多次提交的问题。对于请求的重复提交,前端有一些治标的办法,后台也有一些常规的token验证。但是在并发的情况下,一些传统的办法失去了作用。

1、比如说前台js控制,如果遇到恶意攻击,通过接口无限并发请求,数据还是会出问题。

2、session里面存token的方式还是有问题,如果本身打开了2个页面,一个页面提交了一个请求,此时服务器把token改变,那另外一个页面获取的token就失效了。

下面是我想到的一些办法,高手轻拍:

由于我接口的逻辑是先查询数据库,看看数据是否有某种标志,满足则进入插入数据步骤。
导致在并发的时候大家查数据的时候都满足,都进入了插入数据步骤,导致重复插入。

现在的办法是利用数据库的update对行进行加锁,如果数据被锁,则执行下一条数据。

比如有10条数据需要处理,2个线程进来,数据1被线程1锁定,那线程2就处理数据2,以此类推。

根据这个情况,我发现可以根据这个特性对数据进行分片处理。那就是在接口逻辑本身,对数据操作的时候就开多个线程同时跑,反正有锁,不用担心会重复执行,但是效率上提高了很多。最终把每个线程成功的结果返回,最终汇总和原始数据比较是否一致,一致的话就处理完成,不一致找出失败的进行提示。由于我只是对数据批量插入,不用管是否有失败的数据要回滚之类的。

猜你喜欢

转载自wzw5433904.iteye.com/blog/2344011