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;
            }
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/luo-mao/p/7804404.html
Copyright © 2011-2022 走看看