甚麼是Propagation(傳播)呢?當一個Transaction方法(method)碰到另一個Transaction方法(method)時的處理行為。
Propagation Types(傳播類型)一共有八種,說明如下:
序號 | Propagation Types & Description傳播類型與說明 |
---|---|
1 | TransactionDefinition.PROPAGATION_MANDATORY ◆說明– Supports a current transaction; throws an exception if no current transaction exists. (支持當前 Transaction;如果當前 Transaction 不存在,則引發異常。) ◆Spring org.springframework.transaction.annotation.Propagation.MANDATORY |
2 | TransactionDefinition.PROPAGATION_NESTED ◆說明– Executes within a nested transaction if a current transaction exists. (如果當前 Transaction 存在,則在嵌套 Transaction 中執行。) ◆Spring org.springframework.transaction.annotation.Propagation.NESTED |
3 | TransactionDefinition.PROPAGATION_NEVER ◆說明– Does not support a current transaction; throws an exception if a current transaction exsts. (不支持當前 Transaction;如果當前 Transaction 存在,則引發異常。) ◆Spring org.springframework.transaction.annotation.Propagation.NEVER |
4 | TransactionDefinition.PROPAGATION_NOT_SUPPORTED ◆說明– Does not support a current transaction; rather always execute nontransactionally. (不支持當前 Transaction;而是始終以非 Transaction 方式執行。) ◆Spring org.springframework.transaction.annotation.Propagation.NOT_SUPPORTED |
5(常用) | TransactionDefinition.PROPAGATION_REQUIRED ◆說明– Supports a current transaction; creates a new one if none exists. (支持當前 Transaction;如果不存在,則創建一個新的。) ◆Spring org.springframework.transaction.annotation.Propagation.REQUIRED ◆This is the default setting of a transaction annotation. (Spring @Transaction Propagation屬性之預設值) |
6(常用) | TransactionDefinition.PROPAGATION_REQUIRES_NEW ◆說明– Creates a new transaction, suspending the current transaction if one exists. (創建一個新 Transaction,如果 Transaction 存在則暫停當前 Transaction 。) ◆Spring org.springframework.transaction.annotation.Propagation.REQUIRES_NEW |
7 | TransactionDefinition.PROPAGATION_SUPPORTS ◆說明– Supports a current transaction; executes non-transactionally if none exists. (支持當前 Transaction;如果不存在,則以非 Transaction 方式執行。) ◆Spring org.springframework.transaction.annotation.Propagation.SUPPORTS |
8 | TransactionDefinition.TIMEOUT_DEFAULT ◆說明– Uses the default timeout of the underlying transaction system, or none if timeouts are not supported. (使用基礎 Transaction 系統的默認超時;如果不支持超時,則不使用默認超時。) ◆Spring 不支援 |
- TransactionDefinition.PROPAGATION_MANDATORY (MANDATORY强制性)
- 不开事务就报错
- 开了用当前事务
- 只要外层或内层报错无捕获就全部回滚,因为同一事务
- TransactionDefinition.PROPAGATION_NESTED(NESTED嵌套)
- 无论调用者是否开启事务,NESTED被调用者都会新起事务
- 嵌套事务在外层commit
- 外层异常影响内层
- 内层异常不影响外层
- TransactionDefinition.PROPAGATION_NEVER(NEVER从不)
- 调用者开了事务就报错
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED(NOT_SUPPORTED不支持)
- NOT_SUPPORTED被调用者始终不开启/不支持事务
- 【default、常用】TransactionDefinition.PROPAGATION_REQUIRED(REQUIRED需要)
- 支持调用者开启的事务
- 如果调用者未开启事务,则在本方法创建一个新事务
- 只要外层或内层报错无捕获就全部回滚,因为同一事务
- 【常用】TransactionDefinition.PROPAGATION_REQUIRES_NEW
- 无论调用者是否开启事务,都会创建一个新事务
- 事务相互独立
- TransactionDefinition.PROPAGATION_SUPPORTS(SUPPORTS支持)
- ※在此傳播屬性下,被調用者是否有 Transaction,完全依賴於調用者,調用者有 Transaction 則有 Transaction,調用者沒 Transaction 則沒 Transaction 。
- 在开启事务的情况下,只要外层或内层报错无捕获就全部回滚,因为同一事务