java 樂觀鎖CAS

樂觀鎖是一種思想,自己代碼裏並無lock或synchronized關鍵字進行修飾。而是採用一種version。數據庫

即先從數據庫中查詢一條記錄獲得version值,在更新這條記錄時在where條件中對這個version進行判斷是否發生了變化。ide

若version值不變則更新這條數據。若先後兩個version值不等則不更新,繼續下一次循環。這樣就確保了在同一時間只有一個線程來修改這個值spa

 

以下只要updateCount=0則繼續循環取值。線程

try {
            //啓動CAS樂觀鎖
            do {
                BmRiderInterestingNews news = bmRiderInterestingNewsDao.getInterestingNewsByNewsId(interestingNewsId);
                if (news == null) {
                    return -2;//對象爲空
                }

        /*
            進行審覈結果校驗:
            INIT(0),   //疑似,機器不經過
            MACHINE_PASS(1), //機器經過
            MANUAL_PASS(2), //人工經過
            MANUAL_DELETE(3), //人工刪除
            備註:若是是機器經過,返回的是「人工經過」,若是是「疑似」,會進入審覈後臺進行人工審覈。
         */
                int auditStatus = 0;//1審覈經過 2審覈不經過

                //審覈經過
                if (verifyStatus == 1 || verifyStatus == 2) {
                    auditStatus = 1;
                }
                //審覈不經過
                if (verifyStatus == 3) {
                    auditStatus = 2;
                }


                if (verifyStatus == 0) {
                    return 0;//疑似經過須要進一步等待
                }
                if (auditStatus == 0) {
                    return 1;//數據錯誤
                }


                // 文字審覈
                if (type == 0) {
                    //文字審覈駁回
                    if (auditStatus == 2) {
                        updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
                    }
                    //文字審覈經過
                    else {
                        //圖片審覈經過
                        if (news.getImage_audit_status() == 1) {
                            updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 1, auditStatus, news.getVersion(), DateUtil.unixTime());
                        }
                        //圖片待審覈
                        else if (news.getImage_audit_status() == 0) {
                            updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 0, auditStatus, news.getVersion(), 0);
                        }
                        //圖片駁回
                        else {
                            updateCount = bmRiderInterestingNewsDao.updateTextAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
                        }
                    }
                }
                //圖片審覈
                else {
                    //圖片審覈被駁回
                    if (auditStatus == 2) {
                        updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
                    }
                    //圖片審覈經過
                    else {
                        //文字審覈經過
                        if (news.getText_audit_status() == 1) {
                            updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 1, auditStatus, news.getVersion(), DateUtil.unixTime());
                        }
                        //文字待審覈
                        else if (news.getText_audit_status() == 0) {
                            updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 0, auditStatus, news.getVersion(), 0);
                        }
                        //圖片駁回
                        else {
                            updateCount = bmRiderInterestingNewsDao.updateImageAudit(interestingNewsId, 2, auditStatus, news.getVersion(), 0);
                        }
                    }
                }
            } while (updateCount == 0);
        }catch (Exception e){
            logger.error("#BmRiderInterestingNewsService.updateInterestingNewsAuditStatus 趣聞自動審覈更新狀態失敗 id({}) verifyStatus({}) type({})",interestingNewsId,verifyStatus,type,e);
            return 1;
        }
相關文章
相關標籤/搜索