应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

支付宝一面多线程事务怎么回滚?说用Transactional

  背景介绍
  1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。
  2,在spring中可以使用Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚,导致数据错误。
  3,下面用一个简单示例演示多线程事务。公用的类和方法平均拆分list方法。paramsourceparamnparamTreturnpublicstaticTListListTaverageAssign(ListTsource,intn){ListListTresultnewArrayListListT();intremaidersource。size()n;intnumbersource。size()n;intoffset0;偏移量for(inti0;in;i){ListTvaluenull;if(remaider0){valuesource。subList(inumberoffset,(i1)numberoffset1);remaider;offset;}else{valuesource。subList(inumberoffset,(i1)numberoffset);}result。add(value);}returnresult;}线程池配置versionV1。0publicclassExecutorConfig{privatestaticintmaxPoolSizeRuntime。getRuntime()。availableProcessors();privatevolatilestaticExecutorServiceexecutorService;publicstaticExecutorServicegetThreadPool(){if(executorServicenull){synchronized(ExecutorConfig。class){if(executorServicenull){executorServicenewThreadPool();}}}returnexecutorService;}privatestaticExecutorServicenewThreadPool(){intqueueSize500;intcorePoolMath。min(5,maxPoolSize);returnnewThreadPoolExecutor(corePool,maxPoolSize,10000L,TimeUnit。MILLISECONDS,newLinkedBlockingQueue(queueSize),newThreadPoolExecutor。AbortPolicy());}privateExecutorConfig(){}}获取sqlSessionauthor86182versionV1。0ComponentpublicclassSqlContext{ResourceprivateSqlSessionTemplatesqlSessionTemplate;publicSqlSessiongetSqlSession(){SqlSessionFactorysqlSessionFactorysqlSessionTemplate。getSqlSessionFactory();returnsqlSessionFactory。openSession();}}
  另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖2000道Java面试题,几乎覆盖了所有主流技术面试题。示例事务不成功操作测试多线程事务。paramemployeeDOListOverrideTransactionalpublicvoidsaveThread(ListEmployeeDOemployeeDOList){try{先做删除操作,如果子线程出现异常,此操作不会回滚this。getBaseMapper()。delete(null);获取线程池ExecutorServiceserviceExecutorConfig。getThreadPool();拆分数据,拆分5份ListListEmployeeDOlistsaverageAssign(employeeDOList,5);执行的线程Thread〔〕threadArraynewThread〔lists。size()〕;监控子线程执行完毕,再执行主线程,要不然会导致主线程关闭,子线程也会随着关闭CountDownLatchcountDownLatchnewCountDownLatch(lists。size());AtomicBooleanatomicBooleannewAtomicBoolean(true);for(inti0;ilists。size();i){if(ilists。size()1){atomicBoolean。set(false);}ListEmployeeDOlistlists。get(i);threadArray〔i〕newThread((){try{最后一个线程抛出异常if(!atomicBoolean。get()){thrownewServiceException(001,出现异常);}批量添加,mybatisPlus中自带的batch方法this。saveBatch(list);}finally{countDownLatch。countDown();}});}for(inti0;ilists。size();i){service。execute(threadArray〔i〕);}当子线程执行完毕时,主线程再往下执行countDownLatch。await();System。out。println(添加完毕);}catch(Exceptione){log。info(error,e);thrownewServiceException(002,出现异常);}finally{connection。close();}}
  数据库中存在一条数据:
  SpringBoot基础就不介绍了,推荐下这个实战教程:https:github。comjavastacksspringbootbestpractice测试用例RunWith(SpringRunner。class)SpringBootTest(classes{ThreadTest01。class,MainApplication。class})publicclassThreadTest01{ResourceprivateEmployeeBOemployeeBO;测试多线程事务。throwsInterruptedExceptionTestpublicvoidMoreThreadTest2()throwsInterruptedException{intsize10;ListEmployeeDOemployeeDOListnewArrayList(size);for(inti0;isize;i){EmployeeDOemployeeDOnewEmployeeDO();employeeDO。setEmployeeName(loli);employeeDO。setAge(18);employeeDO。setGender(1);employeeDO。setIdNumber(iXX);employeeDO。setCreatTime(Calendar。getInstance()。getTime());employeeDOList。add(employeeDO);}try{employeeBO。saveThread(employeeDOList);System。out。println(添加成功);}catch(Exceptione){e。printStackTrace();}}}
  测试结果:
  可以发现子线程组执行时,有一个线程执行失败,其他线程也会抛出异常,但是主线程中执行的删除操作,没有回滚,Transactional注解没有生效。
  使用sqlSession控制手动提交事务ResourceSqlContextsqlContext;测试多线程事务。paramemployeeDOListOverridepublicvoidsaveThread(ListEmployeeDOemployeeDOList)throwsSQLException{获取数据库连接,获取会话(内部自有事务)SqlSessionsqlSessionsqlContext。getSqlSession();ConnectionconnectionsqlSession。getConnection();try{设置手动提交connection。setAutoCommit(false);获取mapperEmployeeMapperemployeeMappersqlSession。getMapper(EmployeeMapper。class);先做删除操作employeeMapper。delete(null);获取执行器ExecutorServiceserviceExecutorConfig。getThreadPool();ListCallableIntegercallableListnewArrayList();拆分listListListEmployeeDOlistsaverageAssign(employeeDOList,5);AtomicBooleanatomicBooleannewAtomicBoolean(true);for(inti0;ilists。size();i){if(ilists。size()1){atomicBoolean。set(false);}ListEmployeeDOlistlists。get(i);使用返回结果的callable去执行,CallableIntegercallable(){让最后一个线程抛出异常if(!atomicBoolean。get()){thrownewServiceException(001,出现异常);}returnemployeeMapper。saveBatch(list);};callableList。add(callable);}执行子线程ListFutureIntegerfuturesservice。invokeAll(callableList);for(FutureIntegerfuture:futures){如果有一个执行不成功,则全部回滚if(future。get()0){connection。rollback();return;}}connection。commit();System。out。println(添加完毕);}catch(Exceptione){connection。rollback();log。info(error,e);thrownewServiceException(002,出现异常);}finally{connection。close();}}sqlinsertidsaveBatchparameterTypeListINSERTINTOemployee(employeeid,age,employeename,birthdate,gender,idnumber,creattime,updatetime,status)valuesforeachcollectionlistitemitemindexindexseparator,({item。employeeId},{item。age},{item。employeeName},{item。birthDate},{item。gender},{item。idNumber},{item。creatTime},{item。updateTime},{item。status})foreachinsert
  数据库中一条数据:
  测试结果:抛出异常,
  删除操作的数据回滚了,数据库中的数据依旧存在,说明事务成功了。
  另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖2000道Java面试题,几乎覆盖了所有主流技术面试题。
  成功操作示例:ResourceSqlContextsqlContext;测试多线程事务。paramemployeeDOListOverridepublicvoidsaveThread(ListEmployeeDOemployeeDOList)throwsSQLException{获取数据库连接,获取会话(内部自有事务)SqlSessionsqlSessionsqlContext。getSqlSession();ConnectionconnectionsqlSession。getConnection();try{设置手动提交connection。setAutoCommit(false);EmployeeMapperemployeeMappersqlSession。getMapper(EmployeeMapper。class);先做删除操作employeeMapper。delete(null);ExecutorServiceserviceExecutorConfig。getThreadPool();ListCallableIntegercallableListnewArrayList();ListListEmployeeDOlistsaverageAssign(employeeDOList,5);for(inti0;ilists。size();i){ListEmployeeDOlistlists。get(i);CallableIntegercallable()employeeMapper。saveBatch(list);callableList。add(callable);}执行子线程ListFutureIntegerfuturesservice。invokeAll(callableList);for(FutureIntegerfuture:futures){if(future。get()0){connection。rollback();return;}}connection。commit();System。out。println(添加完毕);}catch(Exceptione){connection。rollback();log。info(error,e);thrownewServiceException(002,出现异常);thrownewServiceException(ExceptionCodeEnum。EMPLOYEESAVEORUPDATEERROR);}}
  测试结果:
  数据库中数据:
  删除的删除了,添加的添加成功了,测试成功。
  版权声明:本文为CSDN博主weixin43225491的原创文章,遵循CC4。0BYSA版权协议,转载请附上原文出处链接及本声明。原文链接:https:blog。csdn。netweixin43225491articledetails117705686

高质量悬疑片推荐(第一弹)不少人喜欢看电影,而悬疑片是他们的最爱。我把悬疑片,剧情片,惊悚片归为一类,今天,我推荐几部质量上乘的该类型电影,供大家收藏。一、骗中骗(豆瓣8。7)设大局,骗大钱!……大变天?曝郭艾伦有望转会广州叔侄联手再冲冠杨鸣要成光杆司令辽宁队今年夏天进行了一系列的阵容调整工作,按常理来说作为卫冕冠军,保持球队的完整度至关重要。但是辽宁队却反其道而行,送走了张镇麟、刘志轩、孙巍、高诗岩等多名主将。而在引援力度上……阿里城市大脑全套解决方案(覆盖18个领域)完整版来源:阿里云此份方案非常全面,逻辑清晰,学习及参考性都极强;方案以城市大脑为主题,细分出18个细分领域的解决方案。方案目录1、城市交通治理解决方案2、智……林志颖父子出车祸,救出来满脸都是血今日林志颖带着孩子开驾驶特拉斯遭遇严重车祸救出来的时候满脸都是血,伤势严重已被紧急送医院车头烧成废铁,真不知道是不是天太热了导致自燃引起,他可是我我的男神啊一直那么帅,好……动力电池回收迎新机,综合梳理出3大梯队7家企业,包含2只成长近期全球动力电池峰会有带火了电池回收,7月22日有10只概念股涨停。随着电动汽车保有量的增加,与之对于的配套服务也将出现规模效应,比如2022年充电桩就呈现爆发式增长,工信部介……魅族18X成新卷王,魅族17跌至超冰点价,网友马上疯抢魅族18X现在限时卖到200元,售价1899元。下单时可享受六项免息服务,还可获赠魅族45W过充适配器。魅族18X的价格一路走低,性价比越来越高。值得一提的是,由于魅族1……王思聪纠错央视新闻上热搜,网友胆子够肥拥有4044万粉丝的王思聪,又上热搜了。不过,这次王大公子上热搜可不是因为他怼了哪个女网红,这次他怼的是央视的一则新闻:假新闻,删了吧!4月5日,央视新闻在社交平台……赛季首球!武磊替补绝杀,西班牙人主场10塞尔塔北京时间2022年4月10日22点15分,西甲联赛第31轮迎来一场势均力敌的较量,目前排在积分榜第12位的西班牙人(蓝白)主场迎战排名仅高出自己一位的塞尔塔(红白),中国球员武……常规赛MVP不满,拒签5年2。7亿美元合同!掘金一操作恐逼走近日,NBA掘金队当家球星约基奇的经纪人MiskoRaznatovic在采访中向媒体透露,除非本赛季掘金队在季后赛有很大的成绩突破,否则,约基奇绝大可能不会与掘金队签下一份续约……跑男10官宣新阵容,三位老成员回归,当红小花加盟,看点十足《奔跑吧》已经陪伴观众走过了九季了。而跑男的常驻嘉宾邓超、陈赫、郑恺、李晨等人占据着很多观众的视线,节目而备受观众喜爱。唯一遗憾的是邓超、陈赫、王祖蓝等人的离开,成了很多……注意这4个养生建议都是假的,千万别相信,不然费钱又伤身身体健康、长命百岁是我们每个人的愿望,很多人中老年朋友也都非常喜欢看养生节目,网上呢也有各种各样的养生建议,但是有一些错误的养生建议也混杂在其中,如果您听从了这些错误的养生建议……婆媳也能组cp?山河月明马皇后的选择让朱棣真香如今的历史剧,动不动就宫斗皇帝在朝前办公,后宫斗的比战场还要凶。这种套路剧,刚开始看觉得挺新鲜,看多了就觉得千篇一律,而且用后宫阴谋来曲解历史阳谋,这会对很多不熟悉历史的……
Showmaker表情图火了,韩网热议DK大名单,真就一年不前言:S11赛季的比赛已经全部结束了,相信绝大多数的玩家都关注了最近一段时间的世界赛,Lpl赛区的edg战队成功拿到了这一次的冠军,这也让很多的粉丝非常的激动。这段时间的转会期……遭记者质疑,波切蒂诺回击这么懂球,怎么不来坐我的位置?直播吧12月4日讯TyCsport消息,巴黎主帅波切蒂诺在发布会中与记者出现了不愉快的一幕,场面十分尴尬。记者对巴黎的队内体系,人员轮换和进攻主导权提出了质疑。波切……打卡苍岩山今天也要美美的苍岩山风景区位于河北省井陉县东南30公里,距石家庄市70公里,苍岩山有著名的十六景,景景入胜,步步吸引人:书院午荫、悬登梯云、桥殿飞虹、峭壁嵌珠、空谷鸟鸣、悬崖奇……亨利梅西在场上显得孤立无援现在的巴黎属于姆巴佩今夏,梅西从巴萨转会至巴黎圣日耳曼,加盟后他一直都在努力寻找自己的最佳位置,在接受PrimeVideo记者采访时,亨利认为梅西表现不及预期的原因,是他在球场上有些太孤立了,并认……杨倩获清华1。5万奖金!夺首金获赠一套房,奥运后已接多个代言近日,据凤凰网体育报道,奥运冠军杨倩入围了2021年清华大学特等奖学金候选名单,根据规定,她可以拿到1。5万元人民币(下同)的奖学金。如果最终成功当选,那她将再获0。5万元。……浅谈NBA21届热门新秀表现在2021年NBA选秀开始之前,这是一个被公认的选秀大年。在经过了几场比赛的检验之后,这些热门新秀的表现如何呢?一、凯德坎宁安(CadeCunningham)状元秀……2022年哪支球队会抽中状元签?CBA选秀小百科中国篮镜头丨共享精彩篮球CBA丨敬请关注2122赛季CBA联赛刚刚结束,球迷把目光转向各支球队的引援补强方面,由于CBA球员流动性的局限,近两年CBA选秀逐渐成了各支队补……祝卿好大结局小锦的同心结为何掉在地上,有两个意思,顿悟了疯开疯走的《祝卿好》8天就播完了,让别的一些吊着观众胃口不好好播的剧羞红了脸。讲真,剧火不火真的是一门玄学,就比如说这部剧,明明看起来没有什么闪光灯,但就是让很多观众追到……雄鹿剑指总冠军!字母哥已开发新技能,放话不怕湖人和篮网的挑战字母哥在上个赛季带领雄鹿队夺冠之后名声大噪,谁也没有想到之前被热火狂虐的他们竟然能够在上个赛季强势夺冠,而夺冠的过程和字母哥的贡献是密不可分,他对于内线的冲击让篮网和老鹰以及太……孙兴慜和武磊技术对比,差距一目了然两人的基础数据对比:武磊比孙兴慜大半岁,身高体重都不占优势。先来来看看武磊,错失单刀出现的最多的情况:对阵皇马世界级甩卫,射门一言难尽对阵越南……1075,这是结束的序章睁开眼,又少了一天。所有的一切,在今天写下终止符,挺好呀,众痛不如独痛,本来就是因我而起,你们终而解脱,求得大圆满,而我肉身尽消,一丝残魂苟延残喘于人间不得消散,还完罪孽……DNF全服最神秘的紫色卡片,一张图流传了三年,十二亿都买不到DNF这游戏的版本变化还是非常大的,基本上每个新版本都会更新出很多新的装备和道具,而这些新道具装备是比老装备道具要强的多的。也正是这一点属性上的加强,却是让玩家们更加有玩下去的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网