Spring 的聲明式事務管理讓開發者從繁瑣的事務處理代碼中解脫,不再需要手動獲取連接、提交或回滾事務,也無需在業務方法中編寫大量的 try-catch-finally 塊。掌握事務屬性是正確使用聲明式事務的關鍵,它主要由傳播行為、隔離級別、超時時間和只讀標誌四大核心要素組成。在進行事務劃分時,必須先完成事務定義,即配置這些屬性。
Spring 在 TransactionDefinition 接口中定義了這些屬性,供核心事務管理器 PlatformTransactionManager 使用。該接口的關鍵方法如下:
public interface TransactionDefinition {
int getPropagationBehavior(); // 獲取傳播行為
int getIsolationLevel(); // 獲取隔離級別
int getTimeout(); // 獲取超時時間(秒)
boolean isReadOnly(); // 是否只讀事務
}
TransactionDefinition 定義了五個隔離級別常量:
假設 Mary 原工資 1000,財務人員將其改為 8000 但未提交:
// 財務事務 (con1)
Connection con1 = getConnection();
con1.setAutoCommit(false);
update employee set salary = 8000 where empId = "Mary";
此時 Mary 查詢工資:
// Mary 事務 (con2)
Connection con2 = getConnection();
select salary from employee where empId = "Mary"; // 讀到 8000
con2.commit();
財務發現錯誤回滾:
con1.rollback(); // Mary 工資恢復 1000
Mary 讀到的 8000 即為髒數據。這就是 READ_UNCOMMITTED 級別的典型問題。
大多數業務場景推薦使用 ISOLATION_READ_COMMITTED 或 ISOLATION_REPEATABLE_READ,在性能與一致性之間取得平衡。只有極高一致性要求(如財務對賬)才考慮 SERIALIZABLE,並需評估並發性能影響。