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

做公司网站需要注意什么品牌网站建设d小蝌蚪

做公司网站需要注意什么,品牌网站建设d小蝌蚪,网站建设全流程,求个网站没封的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()是为了保障线程同步,不然变成异步线程是无法捕获异常信息的FutureResultVo 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://www.w-s-a.com/news/431944/

相关文章:

  • 购物网站开发流程制作企业网页
  • 定州哪里可以做网站建设项目环境影响登记表备案系统网站
  • 网站建设费属于广告费小猪网站怎么做的
  • 国内优秀设计网站站长哈尔滨微网站建设
  • 如何建设一个优秀的电商网站沐风seo
  • 从零开始学网站建设知乎安防网站下载
  • 打开网站弹出qq应用软件有哪些
  • 温州网站建设seo网站 如何做 中英文切换
  • 聊城做网站的公司资讯信阳 网站建设
  • 天津市工程建设交易网站查汗国珠海 网页设计
  • 龙果学院大型网站稳定性建设汾阳做网站
  • 湖北 个人网站备案时间域名查询备案查询
  • 网站推广方式校园网站怎么建
  • 长沙seo网站排名怎么在百度发帖
  • 织梦贷款网站模板做印章网站
  • 彭州做网站上海百度网络推广
  • 广州网站搭建快速提升网站排名荧光字网站
  • 15年做那些网站能致富做seo是什么意思
  • 各电商网站的特点网站制作2007
  • 用html做一号店网站怎么做公众号注册平台官网
  • 做盈利网站怎么备案vs做网站如何调试
  • 嘉兴做营销型网站廊坊做网站外包
  • 双语网站模板常州做网站的公司
  • 广州市车管所网站建设全国做网站公司前十名
  • 太原手手工网站建设公司视频直播服务
  • 雷达图 做图网站wordpress首页怎么美化
  • 四川做网站设计公司价格vip解析网站怎么做的
  • 网站建设流程域名申请做化工的 有那些网站
  • 软件开发设计流程图seo搜索引擎官网
  • 外国小孩和大人做网站东富龙科技股份有限公司