Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

发布于:2025-06-12 ⋅ 阅读:(25) ⋅ 点赞:(0)

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 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:指定哪些异常类型不触发回滚

网站公告

今日签到

点亮在社区的每一天
去签到