以REQUIRED的機制傳播交易
「Propagation.REQUIRED」是屬性propagation預設值,使用方式如下:
因為是預設,也可以省略:
- @Transactional (propagation = Propagation.REQUIRED)
- public void requiredCase() {
- // ...
- }
若方法上標註@Transactional (propagation = Propagation.REQUIRED),Spring將:
- @Transactional
- public void requiredCase() {
- // ...
- }
1.
檢查是否有使用中的交易,如果不存在就「建立一個新的交易」。
2.
若存在交易但驗證為無效,則拋出例外。
3.
若存在交易且驗證為有效,則使用該交易。
這樣的概念可以使用以下的偽代碼(pseudo-code)來示意:以SUPPORTS的機制傳播交易
- if (isExistingTransaction()) {
- if (isValidateExistingTransaction()) {
- validateExisitingAndThrowExceptionIfNotValid();
- }
- return existing;
- }
- return createNewTransaction();
若屬性propagation值使用「Propagation.SUPPORTS」:
- @Transactional (propagation = Propagation.SUPPORTS)
- public void supportsCase() {
- // ...
- }
則Spring將:
1.
檢查是否有使用中的交易,如果不存在就「不使用交易」。
2.
若存在交易但驗證為無效,則拋出例外。
3.
若存在交易且驗證為有效,則使用該交易。
這樣的概念可以使用以下的偽代碼(pseudo-code)來示意:
- if (isExistingTransaction()) {
- if (isValidateExistingTransaction()) {
- validateExisitingAndThrowExceptionIfNotValid();
- }
- return existing;
- }
- return emptyTransaction();
以MANDATORY的機制傳播交易
若屬性propagation值使用「Propagation.MANDATORY」:
- @Transactional(propagation = Propagation.MANDATORY)
- public void mandatoryCase() {
- // ...
- }
則Spring將:
1.
檢查是否有使用中的交易,如果不存在就「拋出例外」。
2.
若存在交易但驗證為無效,則拋出例外。
3.
若存在交易且驗證為有效,則使用該交易。
這樣的概念可以使用以下的偽代碼(pseudo-code)來示意:
- if (isExistingTransaction()) {
- if (isValidateExistingTransaction()) {
- validateExisitingAndThrowExceptionIfNotValid();
- }
- return existing;
- }
- throw IllegalTransactionStateException;
以NEVER的機制傳播交易
若屬性propagation值使用「Propagation.NEVER」:
- @Transactional(propagation = Propagation.NEVER)
- public void neverCase() {
- // ...
- }
則Spring預期不存在交易;執行時期將檢查是否有使用中的交易,若存在就拋出例外。
這樣的概念可以使用以下的偽代碼(pseudo-code)來示意:
- if (isExistingTransaction()) {
- throw IllegalTransactionStateException;
- }
- return emptyTransaction;
以NOT_SUPPORTED的機制傳播交易
若屬性propagation值使用「Propagation.NOT_SUPPORTED」:
- @Transactional(propagation = Propagation.NOT_SUPPORTED)
- public void notSupportedCase() {
- // ...
- }
則Spring將檢查是否有使用中的交易,如果存在就「暫停」;因此商業邏輯將在交易暫停的情況下被執行。
使用JTATransactionManager可以直接支援這類需求,其他情況則可能是以模擬的方式進行。
以REQUIRES_NEW的機制傳播交易
若屬性propagation值使用「Propagation.NEVER」:
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- public void requiresNewCase() {
- // ...
- }
則Spring將:
1.
檢查是否有使用中的交易,如果不存在就「建立新交易」。
2.
若存在交易則暫停原交易,並建立新交易。
這樣的概念可以使用以下的偽代碼(pseudo-code)來示意:
- if (isExistingTransaction()) {
- suspend(existing);
- try {
- return createNewTransaction();
- } catch (exception) {
- resumeAfterBeginException();
- throw exception;
- }
- }
- return createNewTransaction();
與NOT_SUPPORTED相似,使用JTATransactionManager可以直接支援這類需求,其他情況則可能是以模擬的方式進行。