Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
目前2025年06月05日更新到:
AI炼丹日志-28 - Audiblez 将你的电子书epub转换为音频mp3 做有声书,持续打造实用AI工具指南!📐🤖
💻 Java篇正式开启!(300篇)
目前2025年06月05日更新到:
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
MyBatis 已完结,Spring 正在火热更新中,深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
目前2025年06月05日更新到:
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
👉 点个关注,不迷路!后续还将持续更新更多大模型+数据智能+工程实战内容,敬请期待!
事务配置
事务(Transaction)是指一组操作,要么全部成功,要么全部失败,保持数据一致性。Spring 提供对声明式事务的支持,底层基于 AOP 原理,实现对方法调用的增强。
纯XML模式
Jar包
我们需要确保下面的依赖都是存在的:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.12.RELEASE</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.12.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.12.RELEASE</version>
</dependency>
对应的代码如下所示:
XML 样例
核心的配置如下,这里是个demo:
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><!-- 数据库连接参数 -->
</bean><!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean><!-- 启用事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager" /><!-- 或者使用事务拦截器 + AOP方式 -->
<aop:config><aop:pointcut id="serviceOperation" expression="execution(* com.xxx.service.*.*(..))" /><aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
</aop:config><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="get*" read-only="true" /><tx:method name="find*" read-only="true" /><tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" /><tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception" /><tx:method name="*" propagation="REQUIRED" /></tx:attributes>
</tx:advice>
XML配置
<tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 定制事务的细节、传播行为、隔离级别等 --><tx:attributes><!-- 一般属性配置 --><tx:method name="*" read-only="false" propagation="REQUIRED" isolation="DEFAULT" timeout="-1" /><!-- 针对查询的覆盖性配置 --><tx:method name="query*" read-only="true" propagation="SUPPORTS" /></tx:attributes></tx:advice><aop:config><!-- advice-ref 指向增强=横切逻辑+方位 --><aop:advisor advice-ref="txAdvice" pointcut="execution(* wzk.service.impl.WzkTransferServiceImpl.*(..))" /></aop:config>
对应的截图如下所示:
基于XML+注解
<!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!--开启spring对注解事务的⽀持--><tx:annotation-driven transaction-manager="transactionManager"/>
在接口、类或者方法上添加Transactional注解
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
基于纯注解
Spring注解驱动开发的事务控制配置,只需要把XML配置的部分改为注解实现即可。
注解替换到XML配置文件中的 <tx:annotation-driven transaction-manager=“xxx”> 配置
接着在Spring的配置添加:
// 开启对事物的支持
@EnableTransactionManagement
- propagation:事务传播行为,如 REQUIRED、REQUIRES_NEW
- isolation:事务隔离级别,如 READ_COMMITTED
- timeout:事务超时时间(秒)
- readOnly:是否只读事务,提升查询性能
- rollbackFor:指定哪些异常类型触发回滚(如 Exception.class)
- noRollbackFor:指定哪些异常类型不触发回滚