樂觀鎖是一種思想,自己代碼裏並無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; }