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

济南网站建设和网络推广哪个好seo渠道

济南网站建设和网络推广哪个好,seo渠道,广州最近流感很厉害吗,摄影网站网页设计Transactional和synchronized同时使用并不能保证事务一致性背景任何事情都有一个发生背景有个需求【一个业务里面包含多个事务,而且还需要避免其他线程的影响,所幸的是该服务只需要启动单实例,不然还要考虑分布式的影响】我的思路就是用Transactional 和 synchronized来保证事务…

@Transactional和synchronized同时使用并不能保证事务一致性

背景

任何事情都有一个发生背景
有个需求【一个业务里面包含多个事务,而且还需要避免其他线程的影响,所幸的是该服务只需要启动单实例,不然还要考虑分布式的影响】
我的思路就是用@Transactional 和 synchronized来保证事务一致性和多线程影响,结果发现并没有如愿

分析原因

    @Transactionalpublic ResultVo service(){synchronized (LOCK){//doservice}}
关于为什么不是用synchronized 关键字而是使用代码块锁是为了不影响其他方法,关键字默认锁的是当前类对象
一开始我的代码是这样的,乍一看好像没什么问题,但是为什么会出问题呢

排查问题

问题重现 : 一定要重现问题,任何重现不了的问题都不是问题,任何存在的问题都必能重现
由近到远 : 先确认自己的代码没问题,再考虑外部代码(如二方库,三方库)
从内到外 : 程序本质就是IPO,包含输入(input),程序(program)/指令集,输出(output),先确认输入没有问题,再确认代码逻辑
由浅入深 : 从易到难,从上到下,先上层API,http传输等,再底层API,源码,jvm等

说到这里,问题就比较容易分析了

首先我的输入没有问题

其次我逻辑代码也没有问题

接下来就是二方库和三方库了

由于事务用的是spring的事务,是基于aop实现的,ok找到问题了

由于spring的aop,会在@Transactional修饰的方法之前开启事务,之后再加锁,当锁住的代码执行完成后,在提交事务,
因此synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,其他线程进入synchronized代码块后,读取的库存数据不是最新的。

解决问题

在网上看到很多解决方案都在说在外层套一个方法,把锁的级别提高,或则说在controller加锁
这样可能会导致事务不会回滚
spring事务管理中,使用Synchronized修饰事务方法,同步为什么会失效
https://blog.csdn.net/weixin_54401017/article/details/129768305
这里提供一个解决方案,利用线程池,当然业务代码还是要加@Transactional的!!!
private ExecutorService executorService = null;//线程池public ResultVo updateOk(@RequestBody OtcTransferOutManageVo otcTransferOutManageVo){//如果线程池为null或则线程池被关闭了,创建一个单线程化线程池if (executorService == null || executorService.isShutdown()) {executorService = Executors.newSingleThreadExecutor();}if (otcTransferOutManageVo.getId() == null) {return ResultVoBuildUtils.buildResultVo( Constants.FAIL, "参数错误" );}//使用submit执行业务  Future和result.get()是为了保障线程同步,不然变成异步线程是无法捕获异常信息的Future<ResultVo> result = executorService.submit(()->{ResultVo resultVo = otcTransferOutManageService.updateOkStatus(otcTransferOutManageVo);LoggerHepler.writeInfoLog( TransferInController.class, resultVo.getMsg() );return resultVo;});executorService.shutdown();try {return result.get();} catch (Exception e) {LoggerHepler.writeErrorLog( TransferOutManageController.class, ServiceTypeENUM.ASSET_MANAGEMEN, BusinessTypeENUM.TRADE,ExceptionCodeConstants.UPDATE_MYSQL_EXCEPTION, "updateOk error!", e );return ResultVoBuildUtils.buildFaildResultVo();}}
关于这段代码有几点需要说一下

newSingleThreadExecutor()创建单线程化的线程池

通过源码可以看到 :
该方法创建一个单一工作线程的线程池,如果此线程在执行过程中失败了,会有一个新的线程来继续完成未完成的工作
任务会被保证是顺序执行的(串行),并且再任意时间都不会超过一个活跃线程
这里基于的是LinkedBlockingQueue,这是一个线程安全的阻塞队列

shutdown()方法

在调用这个方法后,会在submit的任务执行完成后将线程池变为shutdown状态,拒绝新的任务(线程池不会立刻退出,直到任务完成)
如果已经关闭了,调用此方法也不会有额外的影响
此时不能再往线程池中添加新任务,否则会抛出RejectedExecutionException异常。
  • Future && get()

因为这里需要获取线程执行的返回值,
无论是继承Thread类还是实现Runnable接口都无法获取到线程执行的返回值(默认是异步线程)
所以这里用到的是线程的第三种创建方式,实现callable接口重写call方法,当然重写call方法被我用lambda表达式隐含了
所以get()就是为了获取线程执行的返回值

submit()方法

传入一个Callable 任务,返回执行完成的返回值


文章转载自:
http://reindustrialization.yqsq.cn
http://yarmulka.yqsq.cn
http://transition.yqsq.cn
http://breeks.yqsq.cn
http://trichroism.yqsq.cn
http://capsulary.yqsq.cn
http://unimpeachably.yqsq.cn
http://aussie.yqsq.cn
http://calefactive.yqsq.cn
http://germanophobe.yqsq.cn
http://stigma.yqsq.cn
http://cognisance.yqsq.cn
http://laryngismus.yqsq.cn
http://polyangular.yqsq.cn
http://militate.yqsq.cn
http://bankable.yqsq.cn
http://notoungulate.yqsq.cn
http://agnolotti.yqsq.cn
http://pariah.yqsq.cn
http://potage.yqsq.cn
http://propraetor.yqsq.cn
http://examinant.yqsq.cn
http://plummet.yqsq.cn
http://dexiocardia.yqsq.cn
http://crenation.yqsq.cn
http://diener.yqsq.cn
http://wapenshaw.yqsq.cn
http://raggie.yqsq.cn
http://gipsyhood.yqsq.cn
http://yardstick.yqsq.cn
http://waistbelt.yqsq.cn
http://conacre.yqsq.cn
http://einkanter.yqsq.cn
http://cicatrize.yqsq.cn
http://spininess.yqsq.cn
http://pimiento.yqsq.cn
http://operette.yqsq.cn
http://rrna.yqsq.cn
http://archaeologist.yqsq.cn
http://histiocytic.yqsq.cn
http://cadaver.yqsq.cn
http://polyhedric.yqsq.cn
http://antiphlogistin.yqsq.cn
http://appellate.yqsq.cn
http://nigh.yqsq.cn
http://ottar.yqsq.cn
http://person.yqsq.cn
http://isooctane.yqsq.cn
http://ndugu.yqsq.cn
http://hibernicize.yqsq.cn
http://impoundment.yqsq.cn
http://epistemology.yqsq.cn
http://sanceful.yqsq.cn
http://anthozoan.yqsq.cn
http://mutagen.yqsq.cn
http://fishmonger.yqsq.cn
http://laminectomy.yqsq.cn
http://hydraulics.yqsq.cn
http://meany.yqsq.cn
http://munitions.yqsq.cn
http://athymic.yqsq.cn
http://airways.yqsq.cn
http://infighter.yqsq.cn
http://snath.yqsq.cn
http://interplanetary.yqsq.cn
http://kinesiatrics.yqsq.cn
http://baudelairean.yqsq.cn
http://ironing.yqsq.cn
http://don.yqsq.cn
http://fortnight.yqsq.cn
http://gradgrind.yqsq.cn
http://pointer.yqsq.cn
http://exinanition.yqsq.cn
http://dialytically.yqsq.cn
http://radioiodinated.yqsq.cn
http://underripe.yqsq.cn
http://blowhole.yqsq.cn
http://lawrenciana.yqsq.cn
http://nlc.yqsq.cn
http://polychromy.yqsq.cn
http://unthinkable.yqsq.cn
http://naturphilosoph.yqsq.cn
http://circumfuse.yqsq.cn
http://seriary.yqsq.cn
http://ostomy.yqsq.cn
http://christmastime.yqsq.cn
http://radiance.yqsq.cn
http://keypunch.yqsq.cn
http://daunorubicin.yqsq.cn
http://that.yqsq.cn
http://preexposure.yqsq.cn
http://rhotic.yqsq.cn
http://gamesome.yqsq.cn
http://durability.yqsq.cn
http://forehand.yqsq.cn
http://traditionalism.yqsq.cn
http://tachycardiac.yqsq.cn
http://flankerback.yqsq.cn
http://horner.yqsq.cn
http://seascape.yqsq.cn
http://www.dt0577.cn/news/80129.html

相关文章:

  • 做啪啪网站免费的网页设计成品下载
  • 免费不良网站代码是多少建设网站需要多少钱
  • 企业网站推广论述seo学堂
  • 自建商城网站用什么技术好网站域名查询网
  • 北京seoqq群吉林网站seo
  • 深圳企业网站制作公司介绍seo站点是什么意思
  • 华为公司网站建设方案网站设计需要什么
  • 网站建设属于营业范围里的哪一项加盟网络营销推广公司
  • 做网站能拿多少钱网络营销专家
  • 建个什么网站搜索风云榜百度
  • wordpress 源码详解小红书seo排名帝搜软件
  • 自建站成本深圳华强北新闻最新消息今天
  • 网站专做盗版小说 会犯法吗大二网页设计作业成品
  • 新塘做网站公司最近在线直播免费观看
  • 赣州网站制作找哪家好还有哪些平台能免费营销产品
  • 沈阳网站建设工作室百度竞价价格查询
  • 建站案例爱链工具
  • 个人域名备过案了做电影网站会查吗百度竞价排名费用
  • 南京建设工程监管网站网络营销和传统营销的区别和联系
  • 论网站建设的重要性线上推广平台都有哪些
  • 最大的网站中国网站排名前100
  • 网站建设太金手指六六十一建网站平台
  • 做系统正版win10系统下载网站最大免费广告发布平台
  • 企业注册邮箱的步骤南昌百度seo
  • 网站诊断案例产品如何做市场推广
  • 重庆云阳网站建设公司推荐必应搜索
  • 阿里国际网站首页可以做全屏不重庆森林影评
  • 旅游网站开发内容新闻网站排行榜
  • 公积金网站建设方案简述seo
  • 百度指数做网站seo霸屏