Spring的事务控制,注解和xml配置以及解释
了解MySql事务 https://www.cnblogs.com/xiaozhang666/p/13446981.html
我们的事务往往加载service层方法上,那么我们现在的业务简单些,直接service调用dao层方法,以后可能涉及service层方法A()直接调用service层方法B()。那么此时A()和B()都有自己的事务控制,那么相互调用的时候就会有问题,A和B应该有一个关于事务的协商机制,这种机制就叫做事务的传播行为。
-
-
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
-
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
-
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
-
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 NEVER:以非事务方式运行,如果当前存在事务,抛出异常
-
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。
Spring的事务机制
Spring的事务机制是Spring给我们提供的一套事务管理的方式,项目中我们就不需要手动去控制事务了
-
Spring的事务管理器PlatformTransactionManager接口,实现类:org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或MyBatis 进行持久化数据时使用
使用到的xml标签
<aop:config> 标签作用: 所有的aop配置都在其中,本质是基于AOP实现的事务管理 <aop:advisor> 配置外部的事务增强切面 advice-ref 属性用来注入事务声明唯一id pointcut="execution(* com.itheima.service.*.*(..))" 切入点表达式含义: 拦截所有业务层的类的所有的方法。 <tx:advice> 事务通知增强切面 id 属性 : 当前通知切面的id唯一标识 注入到advice-ref中 transaction-manager属性 : 事务管理器
<tx:attributes>
配置事务的属性
<tx:method> 切入点拦截方法的事务控制设置 isolation 属性 : 设置事务的隔离级别 DEFAULT采取数据默认的隔离级别: -mysql: repeatable read -Oracle: read committed propagation 属性 : 设置事务的传播行为 -required:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值) 是为带事务的操作加带增删改的操作 -supports:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)** read-only 属性 : 设置当前的事务,是否为只读事务 rollback-for 属性 : 设置当前事务,出现什么异常回滚。如果不设置,出现任何异常都回滚 no-rollback-for 属性 : 设置事务,出现什么异常不回滚。如果不设置,出现任何异常都回滚 timeout 属性 : 超时时间 -1 永不超时 例如 <tx:method name="transfer" isolation="DEFAULT" propagation="SUPPORTS" read-only="false" rollback-for="" no-rollback-for="" timeout="-1"/>
代码实现
注入DataSourceTransactionManager 事务管理器
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"></bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
配置事务管理
<aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.spring.service.UserServiceImpl.*(..))"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"/> <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED"/> <tx:method name="find*" isolation="DEFAULT" propagation="SUPPORTS"/> </tx:attributes> </tx:advice>
此时 execution(* com.spring.service.UserServiceImpl.*(..)) 表达式匹配的方法已经具有事务控制的功能。
扩展 - 事务控制的注解使用
在注解开发中可以注释掉 <aop:config> 和 <tx:advice> 标签,但是要保留事务管理器注入 DataSourceTransactionManager。
@Transactional() 注解作用 : 开启当前方法的事务支持
transactionManager 属性: 设置事务管理器,如果不设置默认是transactionManager
isolation属性: 设置事务的隔离级别
propagation属性: 事务的传播行为
然后将注解写到service层中需要事务控制的方法上。
@Override @Transactional(transactionManager = "transactionManager", isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED) public Integer saveUser(User user) { Integer integer = userMapper.saveUser(user); return integer; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2019-09-10 callback&&callback()
2019-09-10 转 五大浏览器四大内核
2019-09-10 转 document.compatMode介绍
2019-09-10 clientHeight , scrollHeight , offsetHeight之间的区别