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;
            }
  • 相关阅读:
    oracle proc 插入操作性能优化实践
    vmware 虚拟机共享文件夹无法显示问题解决
    oracle启动报错:ORA-03113
    c语言中sprintf()函数中的%使用
    c 的内存分配
    c实现队列
    c实现循环链表
    MantisBT导出Excel文件名显示中文的修改方法
    怎样通过Qt编写C/C++代码查询当前Linux的版本号?
    Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版
  • 原文地址:https://www.cnblogs.com/luo-mao/p/7804404.html
Copyright © 2011-2022 走看看