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;
    }

 

發佈了263 篇原創文章 · 獲贊 56 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章