java 乐观锁CAS

乐观锁是一种思想,本身代码里并没有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;
        }

 

    原文作者:java锁
    原文地址: https://www.cnblogs.com/luo-mao/p/7804404.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞