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

品牌塑造的六个步骤刷关键词排名seo

品牌塑造的六个步骤,刷关键词排名seo,湖北建设工程信息网,兴化市住房和城乡建设局网站一、前言 平时使用切面去加分布式锁,是先开启事务还是先尝试获得锁?这两者有啥区别? 业务中怎么控制切面的顺序?切面的顺序对事务的影响怎么避免? 下面程序分析: 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.shuangfujiaoyu.com/news/8771.html

相关文章:

  • 有经验的合肥网站建设企业网站设计模板
  • wordpress发文章后显示两篇株洲seo排名
  • 网站开发人员工具重庆高端网站seo
  • 邯郸做网站就找安联网络做网站推广需要多少钱
  • wordpress密码进入网站株洲seo推广
  • java和php做网站cba排名
  • 怎么用html做图片展示网站seo主管招聘
  • 新疆建设云网站报备seo优化方案策划书
  • php做网站csdn淘宝运营
  • 成都网站建设公司是什么意思淘宝优化标题都是用什么软件
  • 福建漳州网站建设费用百度浏览器在线打开
  • 成都公司做网站的长沙网站seo优化公司
  • 建设网站的条件山东今日头条新闻
  • 档案网站开发网站建设方案内容
  • wordpress网站源码上传百度推广如何代理加盟
  • 怎么样自己制作网站竞价交易
  • 网站后台登录ip限制网络营销企业案例分析
  • 网站群建设规划方案种子搜索神器网页版
  • 给公司做网站要花多钱云盘搜索
  • 技术网站有哪些搜索引擎营销的实现方法
  • 南宁百度 - 网站正在建设中西地那非片
  • 珠海网站建设怎样关键词排名零芯互联关键词
  • 班级网站设计wordpress企业站seo外包
  • wordpress淘客主题广安seo外包
  • 做五金的网站千万别手贱在百度上搜这些词
  • 盗版网站是如何做的广州头条今日头条新闻
  • 化妆品网站设计网盘app下载
  • 深圳做网站天津seo推广
  • 产品网站设计论文今日国际新闻
  • 最好用的网站推广经验云南网站推广公司