专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

SpringBoot实现Oracle和MongoDB跨库事务

  最近在做一个项目,项目基于SpringBoot实现后端,其中用到了Oracle数据库和MongoDB作为数据存储。
  其中有的功能要求同时对Oracle和MongoDB进行读写操作,特别是写操作如果失败了需要对Oracle和MongoDB进行回滚,最初我们直接使用了SpringBoot提供的Transactional(rollbackForException。class)注解进行事务控制,可系统上线后发现异常发生时并没有回滚MongoDB的写操作,导致Oracle和MongoDB之间出现了数据差异。
  为了解决这个我们我们基于SpringBoo提供的平台事务管理器PlatformTransactionManager通过注解和AOP编程实现了一个跨数据库的事务异常管理器。实现方式如下:
  1。先定义一个事务注解Target({ElementType。METHOD})Retention(RetentionPolicy。RUNTIME)InheritedDocumentedpublicinterfaceMultiTransactional{String〔〕values()default{};}
  2。使用AOP技术定一个事务处理的切面处理类Slf4jAspectComponentpublicclassMultiTransactionalAspect{Around(annotation(multiTransactional))publicObjectaround(ProceedingJoinPointpjp,MultiTransactionalmultiTransactional)throwsThrowable{StackPlatformTransactionManagertransactionManagerStacknewStack();StackTransactionStatustransactionStatusStacknewStack();try{if(!openTransaction(transactionManagerStack,transactionStatusStack,multiTransactional)){returnnull;}Objectretpjp。proceed();commit(transactionManagerStack,transactionStatusStack);returnret;}catch(Throwablee){rollback(transactionManagerStack,transactionStatusStack);log。error({},class:{},method:{},e。getMessage(),pjp。getTarget()。getClass()。getSimpleName(),pjp。getSignature()。getName(),e);throwe;}}privatebooleanopenTransaction(StackPlatformTransactionManagertransactionManagerStack,StackTransactionStatustransactionStatusStack,MultiTransactionalmultiTransactional){String〔〕transactionMangerNamesmultiTransactional。values();判断是否配置了事务管理器,如果指定则使用指定的,如果未指定,则启动使用全部事务管理器if(ArrayUtils。isNotEmpty(multiTransactional。values())){for(StringbeanName:transactionMangerNames){PlatformTransactionManagertransactionManager(PlatformTransactionManager)SpringContextHolder。getBean(beanName);TransactionStatustransactionStatustransactionManager。getTransaction(newDefaultTransactionDefinition());transactionStatusStack。push(transactionStatus);transactionManagerStack。push(transactionManager);}}else{MapString,PlatformTransactionManagertransactionManagerMapSpringContextHolder。getBeansOfType(PlatformTransactionManager。class);for(PlatformTransactionManagertransactionManager:transactionManagerMap。values()){TransactionStatustransactionStatustransactionManager。getTransaction(newDefaultTransactionDefinition());transactionStatusStack。push(transactionStatus);transactionManagerStack。push(transactionManager);}}returntrue;}privatevoidcommit(StackPlatformTransactionManagertransactionManagerStack,StackTransactionStatustransactionStatusStack){while(!transactionManagerStack。isEmpty()){transactionManagerStack。pop()。commit(transactionStatusStack。pop());}}privatevoidrollback(StackPlatformTransactionManagertransactionManagerStack,StackTransactionStatustransactionStatusStack){while(!transactionManagerStack。isEmpty()){transactionManagerStack。pop()。rollback(transactionStatusStack。pop());}}}
  3。MongoDB数据库事务配置(只有MongoDB4。0以上集群部署的情况下才支持事务)ConfigurationpublicclassMongoTransactionManagerConfiguration{BeanConditionalOnProperty(namefood。mongodb。transaction,havingValuetrue)publicMongoTransactionManagermongoTransactionManager(MongoDatabaseFactoryfactory){returnnewMongoTransactionManager(factory);}}
  4。在SpringBoot中强制注册一个事务管理器强制添加一个默认的TransactionManagerConfiguration(proxyBeanMethodsfalse)publicclassTransactionManagerConfiguration{BeanPrimaryDataSourceTransactionManagertransactionManager(Environmentenvironment,DataSourcedataSource,ObjectProviderTransactionManagerCustomizerstransactionManagerCustomizers){DataSourceTransactionManagertransactionManagercreateTransactionManager(environment,dataSource);transactionManagerCustomizers。ifAvailable((customizers)customizers。customize(transactionManager));returntransactionManager;}privateDataSourceTransactionManagercreateTransactionManager(Environmentenvironment,DataSourcedataSource){returnenvironment。getProperty(spring。dao。exceptiontranslation。enabled,Boolean。class,Boolean。TRUE)?newJdbcTransactionManager(dataSource):newDataSourceTransactionManager(dataSource);}}
  至此程序就支持跨Oracle和MongoDB的事务处理了,在需要跨库事务处理的方法上加上MultiTransactional注解即可。
  例如:MultiTransactionalprivatevoidupdateDataToDb(OracleDataInfooracleDataInfo,MongoDBDataInfoMongoDBDataInfo)throwsException{操作Oracle数据库this。oracleDataService。deal(oracleDataInfo);操作MongoDB数据库this。mongoDBDataService。update(MongoDBDataInfo);}
  这种事务处理的方式通过改造可以支持所有平台的事务,包括关系型数据库、MongoDB等等。

去泰国旅游,如何区分是人妖还是妹子,很简单看这三点就可以现在人们的生活都好了,很多人都愿意出国旅游,其中泰国就是很多人出国旅游的首选。(此处已添加小程序,请到今日头条客户端查看)人们之所以选择泰国,除了距离近景色美还有物价低之外,泰国的栈桥天后宫青岛人熟悉的感觉回来了青岛日报社观海新闻1月22日讯今天是大年初一,青岛栈桥天后宫等旅游景点人头攒动,热闹非凡,市民游客在景区浓浓的年味中迎接兔年第一天。大年初一,熟悉的栈桥又回来了今天上午,作为经典地万兴科技焕新春节玩法旗下虚拟数字人IP小麓带你花式送祝福春节临近,虚拟人拜年成为元宇宙时代的新时尚。近期,创意软件A股上市公司万兴科技(300624。SZ)旗下视频创作演示神器万兴录演推出虚拟人拜年祝福H5,携旗下数字虚拟人小麓带来新春坚守岗位迎新春工人日报中工网记者陈昌云通讯员龚菲菲大年三十,在这个阖家团圆的日子里,中铁七局滇中引水楚雄9标项目员工坚守岗位,就地过年。中午,项目部特意组织全体留岗员工及家属开展了一场包饺子迎新济南12家国有A级景区首道门票免费首日游客畅游其中乐度假日来源爱济南新闻客户端2023年春节是我国宣布新冠病毒感染乙类乙管后的首个新春佳节,春节是中华民族的传统佳节,春节假期是人们走亲访友文化消费外出旅游的高峰期。1月21日除夕,是兔年新穿越古今的新春音乐会带你解锁大美龙华如果有一扇门可以穿越时空,你是想回到过去还是去往未来?是梦回千年前的客家墟市,感受熙熙攘攘的人间烟火还是循着青春的足迹,重温指引百年征程的红色誓言?是用心耕耘当下,感受这座城市的锦田亮晒全家福送新春祝福,14岁女儿森碟身高引关注!1月21日,田亮晒一家四口合照,为大家送上新春祝福。照片中田亮和儿子小亮仔都穿着黑色西装搭配白色衬衫,干净又利落,与奥运冠军不拖泥带水的风格相当契合。叶一茜与女儿森碟都穿上了喜庆的穆雷谈班凯罗是他先挑衅我已认清他没时间再和他交朋友直播吧1月22日讯此前在休赛期,老鹰球员穆雷和新科状元班凯罗发生冲突。近日,在AllTheSmoke节目中,穆雷又谈起了班凯罗。他说我喜欢班凯罗。在我看来,我们之间没有任何竞争。但其实我,悲悯张文宏有人说,好人会时常反思自己,怕自己对不起别人,而坏人从来不会反思自己,只会得寸进尺变本加厉。近日,我因为批驳张文宏说的一些荒谬言论,被张文宏粉丝疯狂谩骂网暴。于是,我反思了自己。经新年的美好愿望时间,记录着我们的脚步汗水,书写了我们的人生告别壬寅虎年,继续前行捧着辛勤收获的一切欢畅载着所有美好的幸福珍藏迎接癸卯兔年,踏上征程生活既要尽心,也要开心人生要有信心,更要决心网图散文我是不是很伟大文王小鱼一hr喝过酒之后,我想到海子,想到许立志。我还想到一些英雄人物,邱少云,黄继光。我不止一次地想过他们,想过我活在这个世上,应该学习雷锋。记得我学会的第一首歌曲,我在马路上捡
青海省粮食局,半年内一位老局长三位副局长被查,这是怎么了?粮食系统专项反腐大刀阔斧,打虎拍蝇不断深入,从国家粮食和物资储备局局长张务锋原国家粮食局副局长徐鸣等大老虎,到各个地方粮食局及粮库等粮食系统的各级干部,不断有人落马被查,被披露出来美得州小学枪击事件细节披露案发教室门无法反锁,警方本可在3分钟内阻止悲剧(观察者网讯)当地时间6月21日,美国得克萨斯州公共安全部负责人披露了此前罗布小学枪击案的细节,指出警方本可以在到达后3分钟内阻止事件发生,且案发教室的门实际无法从内反锁,反驳了此歹徒抢劫阿根廷华人超市遭警方追击双方发生交火中国侨网6月22日电据阿根廷华人网报道,日前在阿根廷布省洛马斯德尔米拉多尔(LomasdelMirador)地区,一伙歹徒同警方发生枪战,整个过程被街上的监控拍了下来。据了解,数名睡觉时猛然抖一下,有脚踩空的感觉,是身体在暗示什么吗?相信大部分人都会经历这样的情况,就是在熟睡时身体会突然猛抖一下,不过几分钟就能入睡。有人说睡觉时猛然抖一下,说明在长个子也有部分人认为,是大脑正在测试人们是否死亡,总之有很多说法,大众汽车感觉良好,CEO迪斯称可缩小与特斯拉之间的差距IT之家6月22日消息,大众汽车公司首席执行官赫伯特迪斯(HerbertDiess)出席了今日的卡塔尔经济论坛并发表讲话。迪斯表示,大众汽车正在电池生产充电基础设施和软件等领域努力尹正评论区沦陷,又被质疑假减肥,醉酒视频胖出新境界最近在微博搜索男星尹正的名字,会发现他大名关联词条格外尴尬,分别是尹正喝醉后狂亲男的尹正亲的是刘天佐,还有一个是尹正女朋友。其中尹正喝醉后狂亲男的话题还登上了热搜,网友瞬间开启缺德2022腾讯视频片单发布刘德华将监制新无间道(115)1905电影网专稿6月21日,2022腾讯视频影视年度发布在京举办。会上,腾讯在线视频副总裁韩志杰介绍了平台在上半年剧集市场的表现和新周期下对内容创作策略的新思考,并分享国民阅读经典唐诗三百首迎来短视频版,叶嘉莹领衔讲解6月22日,短视频版唐诗三百首正式上线。该项目由抖音南开大学文学院中华书局字节跳动公益联合发起,计划未来一年内邀请多位专家学者,讲解诵读313首唐诗,从而完成这一国民阅读经典的短视中国南沙三大劣势地位转变为优势,南威岛或成争端解决的最大障碍南沙群岛散布在南海南部多山的海底高原上,共由230多个岛屿沙洲暗礁暗沙及暗滩组成。南海地形图这片面积88。6万平方公里的海域对中国的重要性怎么描述都不为过,其战略价值主要体现在三个大学生别来支教了,山区人们哭诉求放过,对孩子百害无一利与城市内相比较,部分山区的教育资源非常落后,甚至有部分地区连像样的教室都没有,一间破屋子几条木板凳就成为了学生们学习的地方,如此贫困的条件也难以阻挡学生们求知的心。对于我国偏远地区十年间,让更多孩子有书读央视网消息在昨天(6月21日)教育部举行的新闻发布会上,相关负责人介绍,国家坚持优先发展义务教育,十年来,义务教育不断加大投入,经费保障水平逐步提高,财政性义务教育经费占比始终保持
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网