乐观锁是一种思想,本身代码里并没有lock或synchronized关键字进行修饰。而是采用一种version。
即先从数据库中查询一条记录得到version值,在更新这条记录时在where条件中对这个version进行判断是否发生了变化。
若version值不变则更新这条数据。若前后两个version值不等则不更新,继续下一次循环。这样就确保了在同一时间只有一个线程来修改这个值
如下只要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; }