spring中設定事務的傳播屬性有如下7種:
required
業務方法需要在乙個事務中執行,如果方法執行時,已處在乙個事務中,那麼就加入該事務,否則自己建立乙個新的事務.這是spring預設的傳播行為.
supports
如果業務方法在某個事務範圍內被呼叫,則方法成為該事務的一部分,如果業務方法在事務範圍外被呼叫,則方法在沒有事務的環境下執行.
mandatory
只能在乙個已存在事務中執行,業務方法不能發起自己的事務,如果業務方法在沒有事務的環境下呼叫,就拋異常
requires_new
業務方法總是會為自己發起乙個新的事務,如果方法已執行在乙個事務中,則原有事務被掛起,新的事務被建立,直到方法結束,新事務才結束,原先的事務才會恢復執行.
not_supported
宣告方法不支援事務,如果方法沒有關聯到乙個事務,容器不會為它開啟事務.如果方法在乙個事務中被呼叫,該事務會被掛起,在方法呼叫結束後,原先的事務便會恢復執行.
never
宣告方法絕對不能在事務範圍內執行,如果方法在某個事務範圍內執行,容器就拋異常.只有沒關聯到事務,才正常執行.
nested
如果乙個活動的事務存在,則執行在乙個巢狀的事務中.如果沒有活動的事務,則按required屬性執行.它使用了乙個單獨的事務, 這個事務擁有多個可以回滾的保證點.內部事務回滾不會對外部事務造成影響
這幾類屬性的實現,主要需要如下幾個方法:
1. 判斷當前是否在乙個事務中;istransactionexist
2. 把方法加入當前事務中; putincurtransaction
3. 掛起原有方法,建立新的事務; suspendcurandnewtra
4. 事務巢狀,內部回滾; nesttransaction
istransactionexist()
putincurtransaction
suspendcurandnewtra
nesttransaction
有了這幾個函式, 則上述7類傳播屬性都可以實現:
requiredelse
}supports
mandatoryelse
}
requires_new
not_supported
neverelse
}
nestedelse
}
spring 事務傳播性
大白話講就是,方法之間互相呼叫的時候,事務如何傳播,比如a 呼叫b b 的事務是和a 共用乙個事務 失敗一起提交 還是新事務 兩者事務互不影響 還是說b 不需要事務?這就是事務傳播性的意思。transactional public void methoda transactional public ...
spring事務的傳播性
spring事務的傳播行為 1.propagation manatory 強制使用當前事務,如果當前沒有事務,就會丟擲乙個異常 2.propagation nested 如果當前存在事務,則在該事務內巢狀執行 巢狀執行時屬於該事務的子事務,當外層事務提交時,子事務跟著提交 子事務提交或回滾不會影響外...
spring宣告式事務支援7種傳播行為
propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 支援當前事務,如果當前沒有事務,就丟擲異常。propa...