以REQUIRED的機制傳播交易
「Propagation.REQUIRED」是屬性propagation預設值,使用方式如下:
@Transactional (propagation = Propagation.REQUIRED)
public void requiredCase() {
// ...
}
因為是預設,也可以省略:
@Transactional
public void requiredCase() {
// ...
}
若方法上標註@Transactional
(propagation = Propagation.REQUIRED),Spring將:
1.
檢查是否有使用中的交易,如果不存在就「建立一個新的交易」。
2.
若存在交易但驗證為無效,則拋出例外。
3.
若存在交易且驗證為有效,則使用該交易。
這樣的概念可以使用以下的偽代碼(pseudo-code)來示意:if (isExistingTransaction()) {
if (isValidateExistingTransaction()) {
validateExisitingAndThrowExceptionIfNotValid();
}
return existing;
}
return createNewTransaction();
以SUPPORTS的機制傳播交易
若屬性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可以直接支援這類需求,其他情況則可能是以模擬的方式進行。