当前位置: 首页 > news >正文

网站做的好看术语企业如何注册自己的网站

网站做的好看术语,企业如何注册自己的网站,石家庄住房与城乡建设官网,网站qq弹窗一、前言 平时使用切面去加分布式锁,是先开启事务还是先尝试获得锁?这两者有啥区别? 业务中怎么控制切面的顺序?切面的顺序对事务的影响怎么避免? 下面程序分析: OverrideTransactionalpublic ReceiveH5…

一、前言

平时使用切面去加分布式锁,是先开启事务还是先尝试获得锁?这两者有啥区别?

业务中怎么控制切面的顺序?切面的顺序对事务的影响怎么避免?

下面程序分析:

    @Override@Transactionalpublic ReceiveH5ActivityPrizeResponse receive(ReceiveH5ActivityPrizeRequest request) {logger.info("xxx:{}", JSON.toJSONString(request));ReceiveH5ActivityPrizeResponse response=new ReceiveH5ActivityPrizeResponse();String lockName="receiveH5ActivityPrize" + request.getActivityId();final DistributeLock lock = jedisLockFactory.getJedisLock(lockName,20, TimeUnit.SECONDS);// 1.加锁lock.lock();try {//todo // 2 业务逻辑 先判断是否存在,不存在插入一条数据,存在返回(不插入)} finally {// 3.释放锁lock.unLock();}// 4 返回return response;}

分布式锁失效并不是真正的失效,只是读到数据,读取的数据库数据不是最新的。

@Transactional 注解在执行该方法时开启一个事物,当执行到3步时,insert 事物务还未提交,因此其它线程进入分布式锁代码块后,继续会执行2操作,发现数据不存在继续插入一条新数据,存在两条记录,此时数据就会出现 bug 问题。

解决办法:先加锁,然后在开启事物,可以保证安全性。 

二、普通未指定 order 的切面和 @Transactional 的先后顺序

        先说下为啥会考虑到这个,我们可以知道 @Transaction 一般加在具体要执行业务的service 方法上,那如果我要进行并发控制对业务进行加锁,那么尝试锁和开启事务孰先孰后呢?

    @Override@Transactional@RedisLock(key = Constant.FANLI_GRANT_VIP_LOCK, param = "#vipOrderNo")public void grantGdVip(String vipOrderNo) {// 业务逻辑}

        按照业务流程上来看我们需要先尝试锁后开启事务,因为没获得锁开启事务需要和数据库进行交互开启一个新的事务,平常对业务结果是不会影响的,但是当高并发时是会对数据库带来不小压力。

总结:

        如果普通切面没指定 order 会比 transaction 后执行。当锁或者一些检查性切面被使用时如果条件不满足不能进入业务也会导致事务的开启产生了不必要的消耗,当并发高时尤为明显。

三、切面的顺序对事务的影响怎么避免?

其实避免方式有三种,一种是指定order,一种是把自定义切面移到更外层中,一种是使用编程式事务。

1、指定 Order

@Aspect
@Component
@Slf4j
@Order(1)
public class LockAspect {}

2、移到最外层中

移到更外层中就不用证明了,调用的自然顺序,比如放在Controller的方法上。

    @PostMapping("/web/cardb/gift/receive")@ApiOperation("B卡赠品领取接口")@TokenAuthentication@RedisLock(key = LockKey.RECEIVE_CARD_B_GIFT, param = "#userInfo.userId")public ApiResultResponse receiveCardBGift(@RequestBody @Valid CardbReceiveGiftRequest request) {// 代码
}

3、使用编程式事务

 当然可以,调用的自然顺序,事务的开启更加现式。

四、总结

因为声明式事务比较好用,生产中使用的比较多,只有为了控制事务粒度或者不需要抽出一个新的类(为了使事务生效)才会使用编程式事务。

所以更加倾向于移到更外层,因为指定 order 的前提是你知道事务切面的和不指定order普通切面的顺序,同时一旦切面变多比如有统一加锁切面、统一检查是否认证切面等需要控制自定义切面顺序容易和事务切面搞混,不利于维护,这个也相当于自定义切面和框架前面隔离。这也从一个侧面证明了校验放 controller 的合理性。

五、参考文档

@Transactional和普通自定义切面执行顺序的思考

http://www.yayakq.cn/news/647145/

相关文章:

  • 手机在线做ppt的网站有哪些网站建设介绍
  • 苏州网站制作设计苏州网站推广公司
  • 普宁建设局网站装饰工程施工工艺流程
  • 健康私人定制网站怎么做国家pccm建设申报网站
  • iis7网站绑定域名手机网站产品展示模板
  • 深圳那家做网站好网络推广员好做吗
  • 做与食品安全有关的网站asp保险网站源码
  • 网站安全维护包括什么济南seo推广价格
  • 手机网站怎么做优化静安手机网站建设
  • 要网站开发费用短信境外做网站网站
  • 什么软件是做网站的做电影网站怎么拿到版权
  • 网站建设 青海做网站维护难吗
  • 网站域名改版软装设计师年终总结
  • 上海城乡建设网站证件查询成品短视频app下载有哪些软件好
  • 赣州网站优化公司网站做成小程序
  • wordpress的站点地址如何配置产品设计方案怎么写
  • 做网站需要了解在线设计名片
  • 网站开发团队投入最好的html5画廊显示质量html5的网站
  • 系统开发的方法关键词优化按天计费
  • 广州公司制作网站百度网站地图在线生成
  • 做汽车团购网站有哪些网站编程工资多少
  • 厦门住房和建设局网站商城类网站如何众筹
  • 给女朋友做的网站源码中文搜索引擎有哪些平台
  • 怎么做后台网站一键更新单位网站平台建设汇报
  • 虚拟机建设网站网站数据库 权限设计
  • 台州建设银行官方网站WordPress自定义tag模板
  • 凡科做数据查询网站杭州百度推广开户
  • 长沙网站设计报价淮北矿业 集团 工程建设有限责任公司网站
  • 集团网站制作公司新闻源发稿平台
  • 湖北黄石网站群建设成都网站定制费用