事务配置

事务(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 样例

核心配置如下:

<!-- 配置数据源 -->
<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>
    <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

@Transactional注解属性:

  • propagation: 事务传播行为,如 REQUIRED、REQUIRES_NEW
  • isolation: 事务隔离级别,如 READ_COMMITTED
  • timeout: 事务超时时间(秒)
  • readOnly: 是否只读事务,提升查询性能
  • rollbackFor: 指定哪些异常类型触发回滚(如 Exception.class)
  • noRollbackFor: 指定哪些异常类型不触发回滚