zoukankan      html  css  js  c++  java
  • 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;
            }
  • 相关阅读:
    使用NoSQL可视化管理工具时报错The GuidRepresentation for the reader is CSharpLegacy
    git和github连接权限(这是一个简便方法,不是很安全,建议大家还是用ssh解决)
    python模块的使用
    利用python抓取页面数据
    利用递归解决“汉诺塔的移动”问题(使用python来做的,其它语言也行)
    mysql中利用show profile很直观的看到查询缓存的作用。
    MySQL中show profiles的开启
    浅谈依赖注入
    使用laraval框架和前端完成restful风格的请求对接(这里只是讨论restful的概念)
    利用composer安装laraval
  • 原文地址:https://www.cnblogs.com/luo-mao/p/7804404.html
Copyright © 2011-2022 走看看