許多人認爲spring一個事務方法不該該調用另外一個事務方法,不然將產生兩個事務,實際上是沒有正確理解spring的事務傳播性和邊界spring
Spring 對事務控制的支持統一在 org.springframework.transaction.TransactionDefinition 類中描述,
該類有如下幾個重要的接口方法:接口
int getPropagationBehavior():事務的傳播行爲事務
int getIsolationLevel():事務的隔離級別get
int getTimeout():事務的過時時間it
boolean isReadOnly():事務的讀寫特性。io
所謂事務傳播行爲就是多個事務方法相互調用時,事務如何在這些方法間傳播。Spring 支持 7 種事務傳播行爲:方法
PROPAGATION_REQUIRED 若是當前沒有事務,就新建一個事務,若是已經存在一個事務中,加入到這個事務中。這是最多見的選擇。im
PROPAGATION_SUPPORTS 支持當前事務,若是當前沒有事務,就以非事務方式執行。異常
PROPAGATION_MANDATORY 使用當前的事務,若是當前沒有事務,就拋出異常。時間
PROPAGATION_REQUIRES_NEW 新建事務,若是當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED 以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER 以非事務方式執行,若是當前存在事務,則拋出異常。
PROPAGATION_NESTED 若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與 PROPAGATION_REQUIRED 相似的操做。
下面簡要介紹下事務的邊界