Spring事务处理
Spring提供一种处理事务的统一模型
1、事务
(1)事务是指一组sql语句的集合
(2)事务ACID原则:原子性、一致性、隔离性、持久性
2、Spring事务管理
(1)声明式事务(通过AOP实现) 推荐使用
=把事务的相关资源和内容提供给Spring,Spring能处理事务提交并回滚
=在XML配置文件中配置或者直接基于注解
(2)编程式事务 (代码中进行事务管理,手动实现commit\rollback)不检验事务
3、Spring管理事务的流程
(1)使用事务管理器对象 事务内部提交commit 回滚事务rollback
事务管理器是一个接口 PlatformTransactionManager,定义了事务重要方法(commit\rollback)
其实现类 MyBatis对应事务管理实现类DataSourceTransactionManager
Hibernate对应事务管理实现类HibernateTransactionManager
xml配置文件bean声明对应的事务管理实现类
<bean id="xxx" class="...DataSourceTransactionManager">
(2)说明需要事务的类型
=1、事务隔离级别(4个以ISOLATION_开头的值)
定义了一个枚举类 Isolation
== ISOLATION_DEFAULT:默认的隔离级别
== ISOLATION_READ_UNCOMMITTED:
读未提交 最低的隔离级别,可能导致 脏读、幻读、不可重复读
== ISOLATION_READ_COMMITTED:
读可提交 可能导致幻读、不可重复读
== ISOLATION_REPEATABLE_READ:
可重复读 可能导致幻读
== ISOLATION_SERIALIZABLE:
可序列化 最高级别
=2、事务的超时时间 TIMEOUT_DEFAULT
表示一个方法最长的执行时间,超过时间事务就回滚 单位 秒 默认-1
=3、事务的传播行为(7种)
表示业务方法调用时,事务在方法间是如何使用的,解决业务层方法之间互相调用的事务问题。
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。
== TransactionDefinition.PROPAGATION_REQUIRED
使用最多,注解@Transactional默认这个传播行为
当前存在事务,则加入该事务,当前没有事务,就创建一个新事物
例如:doOther()方法 在被调用时 若存在事务就在事务中运行 ,若不存在事务中,则创建一个事务并在其中运行
== TransactionDefinition.PROPAGATION_REQUIRES_NEW
总是创建一个新的事务,如果当前存在当前事务,则将当前事务挂起。该传播行为内的修饰方法会新开启一个自己的事务,来执行方法。
例如:doSome()方法调用doOther()方法,若有存在事务,则停止,创建新事务执行doOther(),再执行doSome()的被停止的事务 doSome()方法调用doOther()方法,没有事务,doOther()创建新事务执行
==TransactionDefinition.SUPPORTS
如果当前存在事务,就加入当前事务,若当前没有事务,就以非事务方式继续允许
==TransactionDefinition.PROPAGATION_NESTED
如果当前存在事务,则创建一个事务嵌套到当前事务中运行,若没有当前事务,则创建一个新的事务
==TransactionDefinition.PROPAGATION_MANDATORY
如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。错误配置事务不会发生回滚
==TransactionDefinition.PROPAGATION_NOT_SUPPORTED
以非事务方式运行,如果当前存在事务,则挂起当前事务。 错误配置事务不会发生回滚
== TransactionDefinition.PROPAGATION_NEVER
以非事务方式运行,如果存在事务,则抛出异常。 错误配置事务不会发生回滚
(3)事务提交的时机,回滚事务的时机
=1、业务方法执行成功,没有异常抛出,提交事务 调用commit()
=2、业务方法抛出运行时异常,执行回滚 调用rollback()
=3、业务方法抛出非运行时异常,提交事务
4、@Transactional 注解
(1)作用于类上,该类的所有public方法将都具有该类型的事务属性,表示当前方法具有事务
(2)如果该类抛出异常,就会回滚,数据库里的数据也会回滚
@Transactional()
@Transactional(rollbackFor=Exception.class)
(3)如果不配置rollbackFor属性,事务只会在遇到运行时异常RuntimeException时,才会发生回滚;配置rollbackFor=Exception.class,事务遇到非运行时异常也会回滚。
(4)@Transactional 所有可选属性
=1、 propagation
用于设置事务传播属性。该属性类型为Propagation枚举,默认值为Propagation.REQUIRED
=2、isolation
用于设置事务的隔离级别。该属性类型为Isolation枚举,默认值为Isolation.DEFAULT
=3、readOnly
用于设置该方法对数据库的操作是否是只读的。该属性为boolean,默认值为false.
=4、timeout
用于设置本操作与数据库连接的超时时限。单位为秒,类型为int,默认值为-1,即没有时限。一般不设置,影响因素很多
=5、rollbackFor
指定需要回滚的异常类,类型为Class[],默认值为空数组。若只有一个异常类时,可以不使用数组
=6、rollbackForClassName
指定需要回滚的异常类类名。类型为String[],默认值为空数组。若只有一个异常类时,可以不使用数组
=7、noRollbackFor
指定不需要回滚的异常类。类型为Class[],默认值为空数组。若只有一个异常类时,可以不使用数组
=8、noRollbackForClassName
指定不需要回滚的异常类类名。类型为String[],默认值为空数组,若只有一个异常类时,可以不使用数组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码