zoukankan      html  css  js  c++  java
  • 高并发下乐观锁实现

    目前有业务并发更新某业务表,比如用户账户表,可考虑利用数据库乐观锁的办法解决。

    1、表设计

         需要在表中新增version字段,可定义为bigint类型,初始值可设置为0

    2、更新语句mybatis的实现

    复制代码
    <update id="updateConsumeStarWithLook">
            update sys_user_consume_star 
                set current_consume_star_amount = #{currentConsumeStarAmount},
                    update_time = #{updateTime, jdbcType=TIMESTAMP},
                    version = version + 1
                where id = #{id} and version = #{version}
        </update>
    复制代码

    3、业务逻辑层,实现思路:可定义一个更新方法,先查询出当前记录,根据业务进行调用乐观锁实现的updateConsumeStarWithLook,如果更新成功,即该返回值为1时,表示更新成功,当返回值为0时,表示未成功更新,可再次递归调用该更新方法。

    复制代码
    private void updateUserConsumeStarWithLook(String userId,Long starAmount) {
            
            Wrapper<SysUserConsumeStar> wrapper = new QueryWrapper<SysUserConsumeStar>()
                    .eq("user_id", userId);
            
            SysUserConsumeStar sysUserConsumeStar = sysUserConsumeStarService.getOne(wrapper);
            
            Long oldStartAmount = sysUserConsumeStar.getCurrentConsumeStarAmount();
                     
            Long newStartAmount = oldStartAmount + starAmount;
    
            sysUserConsumeStar.setCurrentConsumeStarAmount(newStartAmount).setUpdateTime(LocalDateTime.now());
                    
            Integer result =  sysUserConsumeStarService.updateConsumeStarWithLook(sysUserConsumeStar);
            
            //如果更新失败则继续尝试直到成功为止
            if(result == 0) {
                
                updateUserConsumeStarWithLook(userId,flowType,starAmount);
                
            }
        }
    复制代码

    4、在具体调用上述方法的方法上如果需要加上事务,则需要将事务的隔离级别定义为读已提交,不然在查询的时候会出现脏读,更新无法成功,导致死循环

    @Transactional(rollbackFor = Exception.class,isolation=Isolation.READ_COMMITTED,propagation=Propagation.REQUIRED)

     5、测试,可使用JMater,相关教程可参考:https://blog.csdn.net/u010481688/article/details/81032259

  • 相关阅读:
    IOS 修改UISearchBar 输入框的颜色 placeholder字体的颜色
    iOS-集成微信支付和支付宝支付
    iOS-集成极光推送
    常用iOS开发网站资源
    iOS -媒体播放器 AVPlayer 与 AVPlayerViewController
    使用终端统计代码行数
    swift 与 OC中的需要注意知识点
    去掉tableview顶部留白
    解决UIScrollView把uitableviewcell的点击事件屏蔽
    按钮点击发光效果
  • 原文地址:https://www.cnblogs.com/liliuguang/p/12768838.html
Copyright © 2011-2022 走看看