Spring中@Transactional注解方法實現原理
Spring的@Transactional
注解在方法級別實現事務管理的原理主要基于動態代理和攔截器機制,以下是其核心實現流程:
1. 代理創建階段
當Spring容器啟動時,會為帶有@Transactional
注解的類創建代理對象:
Bean后處理器介入:
InfrastructureAdvisorAutoProxyCreator
識別需要事務管理的Bean對目標Bean創建AOP代理(JDK動態代理或CGLIB代理)
代理對象生成:
// 原始Bean public class UserServiceImpl implements UserService {@Transactionalpublic void createUser(User user) {// 業務邏輯} }// 生成的代理對象(偽代碼) public class UserServiceProxy extends UserServiceImpl {private TransactionInterceptor txInterceptor;public void createUser(User user) {// 代理邏輯txInterceptor.invoke(new MethodInvocation() {// 包裝原始方法調用});} }
2. 方法調用階段
當調用代理對象的方法時,事務攔截器開始工作:
攔截器調用鏈:
客戶端調用 ↓ Proxy.invoke() ↓ TransactionInterceptor.invoke() ↓ TransactionAspectSupport.invokeWithinTransaction()
事務準備流程:
protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation) throws Throwable {// 1. 獲取事務屬性(解析@Transactional注解)TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);// 2. 獲取事務管理器PlatformTransactionManager tm = determineTransactionManager(txAttr);// 3. 根據傳播行為決定事務操作TransactionStatus status = tm.getTransaction(txAttr);try {// 4. 執行原始方法Object result = invocation.proceedWithInvocation();// 5. 提交事務tm.commit(status);return result;} catch (Throwable ex) {// 6. 異常處理(決定是否回滾)completeTransactionAfterThrowing(txAttr, status, ex);throw ex;} }
3. 關鍵組件協作
組件 | 作用 |
---|---|
TransactionInterceptor | 方法調用的攔截器,包含核心事務邏輯 |
TransactionAttributeSource | 解析@Transactional 注解屬性 |
PlatformTransactionManager | 實際執行事務操作(begin/commit/rollback) |
TransactionSynchronizationManager | 通過ThreadLocal管理事務上下文 |
4. 特殊場景處理
自調用問題:
public class OrderService {public void process() {this.updateOrder(); // 自調用不會經過代理,事務失效}@Transactionalpublic void updateOrder() {...} }
解決方案:注入自身代理或拆分到不同類
異常回滾規則:
默認只對
RuntimeException
和Error
回滾可通過
rollbackFor
/noRollbackFor
自定義
事務傳播行為:
@Transactional(propagation = Propagation.REQUIRES_NEW) public void methodA() {// 總是啟動新事務 }
5. 實現原理總結
代理機制:通過AOP創建代理對象包裹原始Bean
攔截處理:方法調用被
TransactionInterceptor
攔截事務管理:根據注解屬性執行事務開始/提交/回滾
線程綁定:使用
ThreadLocal
保持事務上下文一致性資源協調:統一管理Connection等資源
這種設計實現了業務邏輯與事務管理的解耦,開發者只需通過注解聲明事務需求,無需編寫模板化的事務管理代碼。
請再說下代理對象 事物攔截器,事物管理器之前關系及執行流程