javaWeb中如何防止两个人同时操作同一条记录(限制单人操作),使用redis的解决方式

最近在做demo的时候,碰到这么一个问题:当页面上同一角色有两个人登录的时候,他们同时操作统一条记录; 简言之就是,同一记录同一时刻多人操作。这种情况在我的业务中回导致数据的冗余,干扰正常的程序运行。

当时想到的解决办是锁表或者使用缓存(当然其他的方式可以在下方留言探讨~),锁表没有尝试过所以自然就想到了缓存。
实现思路是,当页面端用户选中记录并且进行操作的时候,在服务端先不进行业务处理,而是先使用缓存,判断缓存中是否存在该业务单的操作信息,若果有则直接返回页面端,提示用户当前记录正在办理;如果没有则新增存入该条业务的操作信息,(操作信息的格式自定,注意唯一性),然后进行业务逻辑处理,处理完成(包含异常)之后进行缓存中操作信息的删除,到这里就大公告成。
(如果是集群分布式,注意缓存的共享~~)
初步尝试,欢迎各位的指正!
如下是一部分代码的内容:

public boolean doRedisLock(List<String> idList,String LockFlag,String cacheName){
        boolean islockSuccess = true;
        //防止多人人重复操作
        Map cache = CacheManager.getCache(cacheName);

        List<String> tempLockIdsList = new ArrayList<>();
        for (String idTemp : idList) {
            //判断当前记录是否已经正在办理或者已经办理
            String nowStatus = (String) cache.get(idTemp+LockFlag);
            if(nowStatus == null){//如果当前的缓存中存在该记录的操作,继续遍历
                tempLockIdsList.add(idTemp);
                //先将已经遍历的未被他人操作的记录进行锁定,期间不准他人操作
                cache.put(idTemp+cacheName,cacheName);//先将该记录的业务新增至缓存
            }else{//存在已经在办理的记录
                //将预先锁定的记录解除锁定,清除缓存
                for(String tempLockId: tempLockIdsList){
                    cache.remove(tempLockId+cacheName);
                }
                islockSuccess = false ;
            }

        }
        return islockSuccess;
    }
发布了37 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42755868/article/details/89354264