关系经济人类预测化学自然
中准网
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

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

4月8日 辞凤阙投稿
  背景介绍
  1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。
  2,在spring中可以使用Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚,导致数据错误。
  3,下面用一个简单示例演示多线程事务。公用的类和方法平均拆分list方法。paramsourceparamnparamTreturnpublicstaticTListListTaverageAssign(ListTsource,intn){ListListTresultnewArrayListListT();intremaidersource。size()n;intnumbersource。size()n;intoffset0;偏移量for(inti0;i){ListTif(remaider0){valuesource。subList(inumberoffset,(i1)numberoffset1);}else{valuesource。subList(inumberoffset,(i1)numberoffset);}result。add(value);}}线程池配置versionV1。0publicclassExecutorConfig{privatestaticintmaxPoolSizeRuntime。getRuntime()。availableProcessors();privatevolatilestaticExecutorServiceexecutorSpublicstaticExecutorServicegetThreadPool(){if(executorServicenull){synchronized(ExecutorConfig。class){if(executorServicenull){executorServicenewThreadPool();}}}returnexecutorS}privatestaticExecutorServicenewThreadPool(){intqueueSize500;intcorePoolMath。min(5,maxPoolSize);returnnewThreadPoolExecutor(corePool,maxPoolSize,10000L,TimeUnit。MILLISECONDS,newLinkedBlockingQueue(queueSize),newThreadPoolExecutor。AbortPolicy());}privateExecutorConfig(){}}获取sqlSessionauthor86182versionV1。0ComponentpublicclassSqlContext{ResourceprivateSqlSessionTemplatesqlSessionTpublicSqlSessiongetSqlSession(){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;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注解没有生效。
  点击关注公众号,Java干货及时送达
  Java技术栈专注分享Java技术干货,包括多线程、JVM、SpringBoot、SpringCloud、IntellijIDEA、Dubbo、Zookeeper、Redis、架构设计、微服务、消息队列、Git、面试题、程序员攻略、最新动态等。528篇原创内容
  公众号
  使用sqlSession控制手动提交事务ResourceSqlContextsqlC测试多线程事务。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();}}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面试题,几乎覆盖了所有主流技术面试题。
  成功操作示例:ResourceSqlContextsqlC测试多线程事务。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();}}connection。commit();System。out。println(添加完毕);}catch(Exceptione){connection。rollback();log。info(error,e);thrownewServiceException(002,出现异常);thrownewServiceException(ExceptionCodeEnum。EMPLOYEESAVEORUPDATEERROR);}}
  测试结果:
  数据库中数据:
  删除的删除了,添加的添加成功了,测试成功。
  原文链接:https:blog。csdn。netweixin43225491articledetails117705686
投诉 评论 转载

郎平一家在美国发展挺好!女儿与孙女都是美国人才,入美国籍近日不少网友关注到了中国排球的最新情况,目前中国女排还是不瘟不火,没有培养出更多的年轻新人,球迷们正在等待朱婷的回归,朱婷在最近一段时间表现得不错,手腕的伤病也在慢慢恢复,她在……必须承认,NBA现在顶薪泛滥,但是真配得上5000万年薪的就不得不承认,如今的NBA可以说是薪资泛滥,像奇才队的比尔,巅峰时期也就是刚达到全明星水准,利拉德,最高也就是全明星,还有唐斯,只能算数据刷子,然而这些人的薪资将来都会破5000……国家体育总局公布中华人民共和国第十五届运动会竞赛规程总则近日,体育总局办公厅发布关于印发《中华人民共和国第十五届运动会竞赛规程总则》的通知。具体如下:中华人民共和国第十五届运动会竞赛规程总则第十五届全国运动会坚持以人民为……房地产不再暴利作者丨唐韶葵编辑丨张伟贤图源丨视觉中国如果用一个词来概括2022年的房地产行业,大浪淘沙或许比较合适。刚过去的2022年,全国百强房企销售业绩同比下降超……俄远东唯一面向中国开放的ampampquot经济特区ampa俄罗斯远东地区有696万平方公里的土地将只面对中国开放的经济特区。近段时间来,中俄两国高层之间展开会晤,对于俄罗斯深陷俄乌战争的泥潭,俄罗斯想在经济发展上放大招,俄罗斯计……山药绿豆排骨汤清内热健脾胃这个汤的营养超厉害!清内热健脾胃,非常好的汤,姐妹们赶紧为家人煲一个山药绿豆排骨汤吧!食材:排骨(猪骨)、山药、莲子、绿豆步骤:1。山药削皮切段,绿豆用开水泡……装机还缺显示器?七喜电脑教你如何选!装机购置电脑显示器前,相信大家都会对比或评估显示器的参数、价格、外观等。评估一个显示器的好坏,首先要了解显示器的一些常见参数,如:尺寸、分辨率、刷新率、接口、色域、亮度、面板等……自驾游十笏园古街在潍坊的十笏园,有一条街叫十笏园古街这条街也是完全复古的建筑风格两边都是那种很有特色的商店和小吃夏天的时候,来这里的人非常多特别是晚上,可以用人山人海来……CBA新消息朱芳雨入选篮协领导班子国家队新任主教练上任中国篮协确定新一届的领导班子成员北京时间12月15日,根据国内媒体报道,中国篮协换届选举工作完成,对于篮协换届选举球迷们对于人选都是非常期待的,因为这将会决定中国篮球的未……胃肠道的首要杀手谈论起伤害人体肠胃的食物,大家往往第一时间想起来的是辛辣,但实际上,有另外2种食物,才是肠胃的首要杀手。人体的整个消化道系统,从食管、胃、小肠到结肠,都覆盖了一层黏膜,一……刚刚!A股引爆大变盘信号,会有恐慌雪崩惨烈大跌吗?市场点评:周一市场,在周末4大利好刺激下高开,大盘指数早盘走强,午后滞涨,创业板全天调整,尾盘有所回升,量能突破万亿。板块上,今日最强的是中字体、国企改和金融,关于……支付宝一面多线程事务怎么回滚?用Transactional可背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,……
资讯熊猫mini月销破1。2万辆?国轩高科称3月装车电池超12022年全球DDoS攻击现状与趋势分析报告发布孕期保持锻炼,饮食均衡也能缓解妊娠纹中国三迪2022年总收入约为人民币34。49亿元是蔡斌不放人还是李盈莹要价太高?土耳其球迷竟然造谣李盈莹看了就有食欲的甜品美食文案,还不收藏起来备用免费权益再缩水,腾讯会议要赚钱的心藏不住了中消协对46款充电数据线比较试验,仅14款安全华为孟晚舟身份突变,任正非曾说她永生永世不可能成为接班人累计通行100条!从禁酒到合理化,从酒文化看唐朝政权的兴衰看哭了,孩子给离世3年的父亲发信息被回复我的孩子是最棒的!
什么人不能吃西洋参徦装芣难过的个性繁体字网名尽如人意造句用尽如人意造句大全透明胶带对皮肤有害吗中国式亲子关系最大的痛苦:没有边界感热博聚热点网 运动解剖学前锯肌(六)家庭影院音响有哪些品牌家庭影院音响品牌推荐介绍会做生意的小明花甲泡了一夜还能吃吗看花甲状态死了就不能吃黄石千足金今日价好消息,拜利回归训练,曼联后防升级开始醉翁欧阳修人生在世,旷达通透,但求无愧于心而已

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州