Spring的xml方式声明式事务控制
Spring的xml方式声明式事务控制一、概述前面我们讲了Spring的AOP配置但是这种直接配置在开发中使用得较少一般是事务控制使用得较多在事务控制中利用的也是AOP的原理只不过把事务是当作AOP当中的通知且这个通知由Spring来产生我们只负责配置下面就事务的一些知识和xml方式声明式事务控制进行讲解二、实验以转账来进行实验如果让加钱和减钱各自一个事务的话那么当出现异常情况时可能是减钱了但是另一个账户没有加钱的情况所以要将加钱和减钱组成一个事务?xml version1.0encodingUTF-8?beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocation http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd !--组件扫描--context:component-scan base-packagecom.itheima/!--加载properties文件--context:property-placeholder locationclasspath:jdbc.properties/!--配置数据源信息--bean iddataSourceclasscom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassNamevalue${jdbc.driver}/propertyproperty nameurlvalue${jdbc.url}/propertyproperty nameusernamevalue${jdbc.username}/propertyproperty namepasswordvalue${jdbc.password}/property/bean!--配置SqlSessionFactoryBean作用将SqlSessionFactory存储到spring容器--beanclassorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSourcerefdataSource/property/bean!--MapperScannerConfigurer,作用扫描指定的包产生Mapper对象存储到Spring容器--beanclassorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackagevaluecom.itheima.mapper/property/bean!--还要配置事物管理器在编程式事务中讲过事物管理器具有回滚、获得、提交事务对象的功能不同框架的事务管理器不同--!--底层是mybatismybatis底层是jdbc,jdbc需要connection所以要数据源--beanclassorg.springframework.jdbc.datasource.DataSourceTransactionManageridtransactionManagerproperty namedataSourcerefdataSource//bean!--然后是要配置通知因为这个通知是Spring提供的所以需要用到tx标签--tx:advice idtxadvicetransaction-managertransactionManagertx:attributestx:method name*//tx:attributes/tx:advice!--使用advisor配置AOP--aop:configaop:pointcut idtxPointcutexpressionexecution(* com.itheima.service.impl.*.*(..))/!--配置织入--aop:advisor advice-reftxadvicepointcut-reftxPointcut//aop:config/beans先是从下往上配要用Spring的事务的话也就是通知就需要使用advisor配置织入而且配置通知时需要使用tx标签其中事务中又要配transaction-manager事务管理器一般要配置事务管理器的话都要实现它的继承关系如下在这里Dao层使用的框架是mybatismybatis底层是jdbc,jdbc需要connection所以要数据源配置的是DataSourceTransactionManager且要指定数据源。同时在通知中还要指定method。这样加钱和减钱组成一个事务出现异常加钱和减钱都不能完成了packagecom.itheima.service.impl;importcom.itheima.mapper.AccountMapper;importcom.itheima.service.AccountService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Isolation;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;Service(accountService)Transactional(isolationIsolation.READ_COMMITTED,propagationPropagation.REQUIRED)publicclassAccountServiceImpl2implementsAccountService{AutowiredprivateAccountMapperaccountMapper;OverridepublicvoidtransferMoney(StringoutAccount,StringinAccount,Integermoney){// 如果是编程类事务的话先开一个事务然后try catch以下有异常就回滚accountMapper.decrMoney(outAccount,money);inti1/0;accountMapper.incrMoney(inAccount,money);}publicvoidregistAccount(){}}packagecom.itheima;importcom.itheima.config.SpringConfig;importcom.itheima.service.AccountService;importorg.springframework.context.ApplicationContext;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassAccountTest{publicstaticvoidmain(String[]args){ApplicationContextappnewClassPathXmlApplicationContext(applicationContext.xml);//ApplicationContext app new AnnotationConfigApplicationContext(SpringConfig.class);AccountServiceaccountServiceapp.getBean(AccountService.class);accountService.transferMoney(tom,lucy,500);}}结果钱是没有转成功的。在这里值得注意的是tx的attributes属性name方法名称 *代表通配符 添加操作 addUser、addAccount、addOrders 可统一配置为 add *isolation事务的隔离级别用于解决事务并发问题timeout超时时间默认值为-1单位是sread-only是否为只读模式查询操作建议设置为只读propagation事务的传播行为用于解决业务方法调用业务方法时出现的事务嵌套问题要是没有设置这些属性。会应用数据库默认的但是必须加上tx:method name“*”/在项目中常常是这样设置各大功能一个留一个保底的tx:method nameadd*/tx:method nameupdate*/tx:method namedelete*/tx:method nameselect*/tx:method name*/一般是REQUIRED和SUPPORTS使用得多需要记住。三、原理解析​ tx:advice是通过xml配置的当然是找它的handler了http\://www.springframework.org/schema/txorg.springframework.transaction.config.TxNamespaceHandler进入TxNamespaceHandler//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//packageorg.springframework.transaction.config;importorg.springframework.beans.factory.xml.NamespaceHandlerSupport;importorg.w3c.dom.Element;publicclassTxNamespaceHandlerextendsNamespaceHandlerSupport{staticfinalStringTRANSACTION_MANAGER_ATTRIBUTEtransaction-manager;staticfinalStringDEFAULT_TRANSACTION_MANAGER_BEAN_NAMEtransactionManager;publicTxNamespaceHandler(){}staticStringgetTransactionManagerName(Elementelement){returnelement.hasAttribute(transaction-manager)?element.getAttribute(transaction-manager):transactionManager;}publicvoidinit(){this.registerBeanDefinitionParser(advice,newTxAdviceBeanDefinitionParser());this.registerBeanDefinitionParser(annotation-driven,newAnnotationDrivenBeanDefinitionParser());this.registerBeanDefinitionParser(jta-transaction-manager,newJtaTransactionManagerBeanDefinitionParser());}}进入TxAdviceBeanDefinitionParser()既然是Parser肯定有Parser方法不在本类就在父类和爷爷类这个是在爷爷类publicabstractclassAbstractBeanDefinitionParserimplementsBeanDefinitionParser{publicstaticfinalStringID_ATTRIBUTEid;publicstaticfinalStringNAME_ATTRIBUTEname;publicAbstractBeanDefinitionParser(){}NullablepublicfinalBeanDefinitionparse(Elementelement,ParserContextparserContext){AbstractBeanDefinitiondefinitionthis.parseInternal(element,parserContext);if(definition!null!parserContext.isNested()){try{Stringidthis.resolveId(element,definition,parserContext);if(!StringUtils.hasText(id)){parserContext.getReaderContext().error(Id is required for element parserContext.getDelegate().getLocalName(element) when used as a top-level tag,element);}String[]aliasesnull;if(this.shouldParseNameAsAliases()){Stringnameelement.getAttribute(name);if(StringUtils.hasLength(name)){aliasesStringUtils.trimArrayElements(StringUtils.commaDelimitedListToStringArray(name));}}BeanDefinitionHolderholdernewBeanDefinitionHolder(definition,id,aliases);this.registerBeanDefinition(holder,parserContext.getRegistry());if(this.shouldFireEvents()){BeanComponentDefinitioncomponentDefinitionnewBeanComponentDefinition(holder);this.postProcessComponentDefinition(componentDefinition);parserContext.registerComponent(componentDefinition);}}catch(BeanDefinitionStoreExceptionex){Stringmsgex.getMessage();parserContext.getReaderContext().error(msg!null?msg:ex.toString(),element);returnnull;}}returndefinition;}让端点到达tx:advice然后往下看还有一段BeanDefinitionHolderholdernewBeanDefinitionHolder(definition,id,aliases);this.registerBeanDefinition(holder,parserContext.getRegistry());这是注册BeanDefinition看对应的holder可以看到这是名为txadvice值为TransactionInterceptor的类。那么我们就分析TransactionInterceptorpublicclassTransactionInterceptorextendsTransactionAspectSupportimplementsMethodInterceptor,Serializable{publicTransactionInterceptor(){}发现它实现了MethodInterceptor接口依据之前学过的Advisor配置AOP织入可以知道这相当于配置环绕通知是通过它的invoke方法来配置的NullablepublicObjectinvoke(MethodInvocationinvocation)throwsThrowable{Class?targetClassinvocation.getThis()!null?AopUtils.getTargetClass(invocation.getThis()):null;Methodvar10001invocation.getMethod();invocation.getClass();returnthis.invokeWithinTransaction(var10001,targetClass,invocation::proceed);}targetClass进入invokeWithinTransaction}}else{TransactionInfotxInfothis.createTransactionIfNecessary(ptm,txAttr,joinpointIdentification);ObjectretVal;try{retValinvocation.proceedWithInvocation();}catch(Throwableex){该有的都返回了createTransactionIfNecessary就是开事务了看到createTransactionIfNecessary进入statustm.getTransaction(txAttr);去看tm是谁protectedTransactionInfocreateTransactionIfNecessary(NullablePlatformTransactionManagertm,NullableTransactionAttributetxAttr,finalStringjoinpointIdentification){tm是PlatformTransactionManager平台事务管理器同时我们也看到了createTransactionIfNecessary中的参数ptm那么它是什么呢PlatformTransactionManagerptmthis.asPlatformTransactionManager(tm);tm又是TransactionManagertmthis.determineTransactionManager(txAttr);到此为止后面是最终是通过解析xml文件获取的。再来看status tm.getTransaction(txAttr);进入getTransaction()publicfinalTransactionStatusgetTransaction(NullableTransactionDefinitiondefinition)throwsTransactionException{TransactionStatus事务管理器状态编程式事务的一种PlatformTransactionManager也是其中一种同时又看到这一句returnthis.startTransaction(def,transaction,debugEnabled,suspendedResources);这是开启事务就执行完了createTransactionIfNecessary所以是在执行createTransactionIfNecessary时内部已经开事务了往createTransactionIfNecessary下又可以看到this.commitTransactionAfterReturning(txInfo);就是提交事务了。而开启事务和提交事务又是在invoke方法执行的所以而这个invoke方法又是属于TransactionInterceptor实现了 MethodInterceptor所以我们在配置的时候就通过Advisor来配置TransactionInterceptor实际上声明式事务本质上就是AOP。

相关新闻

键位映射操作:KeybMap的使用方法

键位映射操作:KeybMap的使用方法

KeybMap的键位映射操作十分简便。 用户打开软件即可看到主界面。 界面设计符合用户操作习惯。 点击添加按钮开始创建映射规则。 软件提供清晰的配置选项。 原始值选项用于选择替代按键。 映射值选项用于指定目标按键。 用户可根据实际损坏情况配置。 例如,Q键损坏时…

2026/7/5 3:37:04 阅读更多 →
ZeroClaw vs OpenClaw 能力对比分析以及FeiShu通道对比

ZeroClaw vs OpenClaw 能力对比分析以及FeiShu通道对比

**原创:基于代码结构和技术架构的深度分析**---## 📊 核心架构对比### ZeroClaw (Rust)**架构模式**: 单体应用,编译型语言**核心文件**:- /root/zeroclow/src/channels/lark.rs (3,550 行)- WebSocket 长连接实现- Protobuf 协议解析 (pbbp2.proto)- 异…

2026/7/5 8:36:23 阅读更多 →
亲测好用 9个降AIGC工具测评:本科生降AI率必看攻略

亲测好用 9个降AIGC工具测评:本科生降AI率必看攻略

在当前高校学术环境中,AI生成内容(AIGC)的广泛应用让论文查重和降AI率成为本科生不得不面对的重要课题。随着各大高校对AI痕迹检测技术的升级,单纯依靠AI工具撰写论文已经难以满足学术规范的要求。因此,越来越多的学生…

2026/7/3 10:06:07 阅读更多 →

最新新闻

AI每日支出指标较5月峰值降20%,热潮放缓迹象初显?

AI每日支出指标较5月峰值降20%,热潮放缓迹象初显?

AI每日支出指标较5月峰值下降20%,背后原因待解 自5月达到峰值以来,AI使用的每日支出指标有所下降。硅数据大语言模型(LLM)代币支出指数(SDLLMTK)目前为1.62,较去年12月指数创立时有所上升&#…

2026/7/5 8:36:22 阅读更多 →
2026年无锡干细胞平台发展观察:细胞生物技术与大健康管理的多元路径

2026年无锡干细胞平台发展观察:细胞生物技术与大健康管理的多元路径

2026年干细胞领域发展现状及用户关注焦点近年来,随着细胞生物技术在大健康管理中的应用逐步拓展,公众对细胞存储、免疫细胞制备等服务的关注度持续上升。然而,行业仍处于科研探索与合规服务并行的阶段,用户在选择相关机构时&#…

2026/7/5 8:36:22 阅读更多 →
编程语言全景深邃研究:从历史先驱到现代多范式的演进与洞察

编程语言全景深邃研究:从历史先驱到现代多范式的演进与洞察

编程语言全景深邃研究:从历史先驱到现代多范式的演进与洞察引言:代码的宇宙与工具的哲学自19世纪阿达洛芙莱斯(Ada Lovelace)写下人类历史上第一段算法以来,编程语言便成为了连接人类思维与机器执行的桥梁。两百多年来…

2026/7/5 8:36:22 阅读更多 →
AI成本失控,Claude烧Token换体验,OpenAI压Token提效率,降本先砍谁?

AI成本失控,Claude烧Token换体验,OpenAI压Token提效率,降本先砍谁?

AI成本失控,Claude与OpenAI的不同路线这是正在发生的现实。根据最新数据显示,Anthropic自家公司花在算力上的钱,也已经达到其薪资支出的2.3倍。按照一名高级工程师22.4万美元的完全成本来算,Anthropic每位工程师每年对应的算力支出…

2026/7/5 8:34:22 阅读更多 →
WAIC 2026 揭示算力新趋势:从单卡比拼到系统级竞争,多维度降本增效!

WAIC 2026 揭示算力新趋势:从单卡比拼到系统级竞争,多维度降本增效!

当算力竞赛步入新阶段当算力竞赛步入“系统级主权竞争”新阶段,衡量标准从单芯片峰值转变为整套系统的算力利用率。2026 年,产业重心从训练转向推理,推理算力规模超越训练,算力成为全行业通用基建和日常运营成本。行业关注焦点变为…

2026/7/5 8:32:22 阅读更多 →
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【引子】

AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【引子】

引子——一个面试回答引发的思考 本文是系列开篇,通过一个真实的面试对话,拆解AI对话长场景下的核心痛点,并勾勒出从“初级”到“P7架构师”的五层进阶路线图。 01. 一个让全场安静的面试回答 在某次的前端面试现场,面试官抛出了…

2026/7/5 8:30:22 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻