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

沈阳正规制作网站公司泰州网站建设方案优化

沈阳正规制作网站公司,泰州网站建设方案优化,二级域名建立网站,施工企业工作分解结构简介 本文展示了在Java的多线程环境下使用Spring的TransactionTemplate控制事务的提交与回滚#xff0c;当任何一个子线程出现异常时#xff0c;所有子线程都将回滚 环境 JDK#xff1a;1.8.0_211 SpringBoot#xff1a;2.5.10 说明 本文通过同时写入用户(User)和用户详细…简介 本文展示了在Java的多线程环境下使用Spring的TransactionTemplate控制事务的提交与回滚当任何一个子线程出现异常时所有子线程都将回滚 环境 JDK1.8.0_211 SpringBoot2.5.10 说明  本文通过同时写入用户(User)和用户详细信息(UserDetail)的Demo方式来展开介绍所有的实体类和服务层就忽略不写了只写一个控制器当中的实现整体代码比较简洁明了 先注入需要的依赖  //用户普通信息Autowired private IUserService userService;//用户详细信息 Autowired private IUserDetailService userDetailService;//建立一个线程池private ExecutorService executor Executors.newFixedThreadPool(10);//注入手动事务控制模板 Autowired private TransactionTemplate transactionTemplate; 一、成功  下面是整个手动控制事务的多线程方法会写入成功 RequestMapping(/)public String saveUser(){int len 10;final CountDownLatch latch new CountDownLatch(len);AtomicBoolean b new AtomicBoolean(false);for (int i 0; i len; i) {final int j i;executor.submit(()-{transactionTemplate.execute(transactionStatus -{try {User user new User();user.setUserName(Aj);user.setPhone(15851885878);userService.save(user);UserDetail userDetail new UserDetail();userDetail.setUserId(user.getId());int sex j % 2 0 ? 1 : 0;userDetail.setSex(sex);userDetail.setAddress(江苏省南京市江宁区秣陵街道);userDetailService.save(userDetail);} catch (Exception e) {log.info(保存用户信息发送异常);b.set(Boolean.TRUE);} finally {latch.countDown();}try {latch.await();if(b.get()){log.info(开始回滚);transactionStatus.setRollbackOnly();log.info(回滚完成);}} catch (InterruptedException e) {log.info(线程中断异常);}return true;});});}return OK;} 核心对象AtomicBoolean、ExecutorService、TransactionTemplate。transactionTemplate.execute()方法接受一个事务的状态对象(TransactionStatus)当发生异常时执行setRollbackOnly()即可回滚  代码逻辑每次循环一次线程计数器-1 latch.countDown() 但是await()方法会使当前线程进入阻塞状态直至线程计数器0 时才被唤醒这也是为什么 “ latch.countDown() ” 要放在finally中的原因如果线程计数器没有顺利 -1线程最终无法被唤醒程序将卡死。这时中间某个子线程发生了异常由于所有的线程都是处于阻塞状态并没有执行提交因此当线程被唤醒时发现AtomicBoolean这个对象的引用等于“ true ”了所以都开始执行回滚操作。 内部解析AtomicBoolean这个对象是线程安全的其内部定义了一个被 “ volatile ” 修饰的变量“ value ”。学过并发编程的大概都知道线程对共享变量的工作方式是优先取三级缓存中的工作变量复制一份到自己的工作内存中使用当某个线程因业务需要或发生异常时对于自身工作内存中的共享变量的修改(就是本文中的 b变量 )并同步回主存时对于其他线程是不可知的可见性(Visibility)问题而关键字 “ volatile ”会强制清空其他线程中该变量的值这样每个线程就都会获取到被修改后的最新的值所以每个线程被唤醒时都发现变量btrue了因此都回滚了 volatile可以保证可见性有序性(禁止重排序) 写入成功的截图 二、失败  已知上图是写入成功了下面看看失败的时候会不会回滚在方法中加入以下代码 if(j 8){//执行第九次时异常int div 10/0; } 现在把表中的数据清空 truncate 数据表名 注意我建表时使用了ID自增(auto_increment)使用 “ truncate ” 可以连同auto_increment的标记一起清空让auto_increment可以从1开始 代码执行后报异常并且回滚了 数据也没有新增进去 成功
http://www.huolong8.cn/news/96017/

相关文章:

  • 网站开发常用的数据库重庆品牌设计公司排行
  • 怎么根据已有网站做新网站仿wordpress大学模板
  • 怎么给网站备案网页制作图
  • 建视频网站软件项目管理的过程
  • 网站开发在线杭州互联网企业排名
  • 做细分行业信息网站重庆知名网站建设公司
  • 厚街网站建设费用影楼网站怎么做
  • 适合做手机主页的网站公司网上注册
  • 塘厦理工学校百度seo优化分析
  • 姜堰区住房和城乡建设局网站广州翼讯资讯科技有限公司 网站
  • 网站主持人制作网站代言人php网站如何导入数据库
  • python微信网站开发四川省建筑人才网个人中心
  • 怎么做磁力网站做推文加入视频的网站
  • 网站运行平台包括广告设计与制作专业大学排名
  • 做几何图形和网站wordpress coshtmlcache
  • 做网站设计怎么提升本单位二级网站建设管理制度
  • 深圳专业专业网站设计公司wordpress 无法发送邮件
  • 沈阳做企业网站公众号开发教程零基础
  • 建设银行官方网站app下载做ppt的素材网站
  • 用discuz怎样做网站wordpress代码执行漏洞
  • 怎么做班级网站建设厅官方网站下载专区
  • 诸城网站做的好的附近装修设计公司
  • 宁波北仑网站网页建设网站的投票 计数模块怎么做
  • 网站建设需要那些人才网站没有问题但是一直做不上首页
  • wordpress 错误上海外贸seo
  • 纯代码添加wordpress网站底部导航郑州网络科技公司有哪些
  • 亚马逊欧洲站wordpress 下载附件
  • 深圳网站建设培训机构网站建设期末作业要求
  • 大连哪家公司做网站好北京高端定制网站建设
  • 利津网站建设哪家好软件开发软件定制