一、核心使用方式
声明式事务(推荐)
通过@Transactional
注解实现,需配合配置启用:@Configuration @EnableTransactionManagement public class AppConfig {@Beanpublic PlatformTransactionManager txManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);} }@Service public class UserService {@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED,timeout = 30,rollbackFor = {SQLException.class})public void updateUser(User user) {// 数据库操作} }
编程式事务
使用TransactionTemplate
精细控制:@Service public class OrderService {private final TransactionTemplate transactionTemplate;public OrderService(PlatformTransactionManager txManager) {this.transactionTemplate = new TransactionTemplate(txManager);}public void processOrder() {transactionTemplate.execute(status -> {// 事务内操作return null;});} }
二、核心特性
事务传播行为(Propagation)
REQUIRED
(默认):存在事务则加入,否则新建REQUIRES_NEW
:始终新建事务,挂起原有事务NESTED
:嵌套事务(部分数据库支持)SUPPORTS
/NOT_SUPPORTED
/NEVER
:按需支持/挂起/禁止事务
隔离级别(Isolation)
DEFAULT
:使用数据库默认级别READ_UNCOMMITTED
:可能脏读READ_COMMITTED
:避免脏读(Oracle默认)REPEATABLE_READ
:避免不可重复读(MySQL默认)SERIALIZABLE
:完全串行化
回滚规则
- 默认对
RuntimeException
和Error
回滚 - 可通过
rollbackFor
/noRollbackFor
自定义
@Transactional(rollbackFor = {CustomBusinessException.class})
- 默认对
超时控制
timeout
属性设置超时秒数(默认-1,无限制)- 超时触发
TransactionTimedOutException
只读事务优化
- 设置
readOnly=true
提示数据库优化查询
@Transactional(readOnly = true) public List<User> findUsers() { ... }
- 设置
三、高级特性
多事务管理器协调
使用ChainedTransactionManager
实现跨资源事务:@Bean public PlatformTransactionManager multiTxManager(JpaTransactionManager jpaTm, JmsTransactionManager jmsTm ) {return new ChainedTransactionManager(jpaTm, jmsTm); }
事务事件监听
监听事务生命周期事件:@Component public class TxListener {@TransactionalEventListenerpublic void handleCommit(TransactionCommitEvent event) {// 事务提交后处理} }
响应式事务支持(Spring 5.2+)
配合 Reactive 编程模型:@Transactional public Mono<Void> reactiveUpdate(User user) {return reactiveTemplate.update(user); }
四、最佳实践
注解位置优先级
- 方法注解 > 类注解 > 接口注解
- 避免在接口声明
@Transactional
自调用失效问题
同类内方法调用不会触发 AOP 代理,需通过代理对象调用:((UserService) AopContext.currentProxy()).internalMethod();
事务边界控制
- 保持事务方法短小
- 避免在事务中处理 RPC 调用等长时操作
关键配置项:
- 通过
@EnableTransactionManagement(order = 1)
控制 AOP 顺序- 使用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
手动回滚
Spring 5 事务管理通过抽象层屏蔽底层差异,结合声明式与编程式模式,提供灵活的事务控制能力,是构建企业级应用的核心基础设施。