事务配置
事务(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: 指定哪些异常类型不触发回滚