一、核心使用方式
聲明式事務(推薦)
通過@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 事務管理通過抽象層屏蔽底層差異,結合聲明式與編程式模式,提供靈活的事務控制能力,是構建企業級應用的核心基礎設施。