Spring 對事務控制的支持統一在 TransactionDefinition 類中描述,該類有以下幾個重要的接口方法:
- int getPropagationBehavior():事務的傳播行為
- int getIsolationLevel():事務的隔離級別
- int getTimeout():事務的過期時間
- boolean isReadOnly():事務的讀寫特性。
DefaultTransactionDefinition可以看到默認配置,
private int propagationBehavior = PROPAGATION_REQUIRED;
除了事務的傳播行為外,事務的其它特性 Spring 是借助底層資源的功能來完成的,Spring 無非只充當個代理的角色。但是事務的傳播行為卻是 Spring 憑借自身的框架提供的功能,是 Spring 提供給開發者最珍貴的禮物。
所謂事務傳播行為就是多個事務方法相互調用時,事務如何在這些方法間傳播。Spring 支持 7 種事務傳播行為:
- PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
- PROPAGATION_SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。
- PROPAGATION_MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。
- PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。
- PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
- PROPAGATION_NEVER 以非事務方式執行,如果當前存在事務,則拋出異常。
- PROPAGATION_NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與 PROPAGATION_REQUIRED 類似的操作。
Spring 默認的事務傳播行為是 PROPAGATION_REQUIRED,它適合於絕大多數的情況。假設 ServiveX#methodX() 都工作在事務環境下(即都被 Spring 事務增強了),假設程序中存在如下的調用鏈:Service1#method1()->Service2#method2()->Service3#method3(),那么這 3 個服務類的 3 個方法通過 Spring 的事務傳播機制都工作在同一個事務中。