Spring的事務抽象主要包括三個主要接口, 既PlatformTransactionManager,?TransactionDefinition和TransactionStatus.以PlatformTransactionManager為中心.
org.springframework.transaction.TransactionDefinition: 負責定義事務相關屬性, 包括隔離級別, 傳播行為等.
org.springframework.transaction.PlatformTransactionManager: 參照TransactionDefinition的屬性定義來開啟相關事務.
org.springframework.transaction.TransactionStatus: 負責事務開啟之后到事務結束期間的事務狀態(tài), 也可以通過TransactionStatus對事務進行有限的控制
TransactionDefinition定義的事務熟悉包括:
事務的隔離級別(IsolationLevel),? 有五個值:
????? ??ISOLATION_DEFAULT: 表示使用數(shù)據(jù)庫默認的隔離級別, 通常情況下是Read Committed, mysql是REPEATABLE READ
????????ISOLATION_READ_UNCOMMITTED: 對應Read Uncommitted隔離級別, 無法避免臟讀,不可重復讀,幻讀
????????ISOLATION_READ_COMMITTED: 對應Read Committed隔離級別, 可以避免臟讀, 無法避免不可重復讀和幻讀
????????ISOLATION_REPEATABLE_READ: 對應Repeatable read隔離級別, 可避免臟讀和不可重復讀, 不能避免臟讀
? ? ????ISOLATION_SERIALIZABLE: 對應Serializable隔離級別, 可以避免所有的臟讀,不可重復讀和幻讀, 但并發(fā)效率最低.
事務的傳播行為(PropagationBehavior), 有七個值:
????????PROPAGATION_REQUIRED: 如果當前存在一個事務, 則加入當前事務. 如果不存在任何事務, 則創(chuàng)建一個新的事務.通常作為默認值.
????????PROPAGATION_SUPPORTS: 如果當前存在一個事務,則加入當前事務, 如果當前不存在事務, 則直接執(zhí)行. 對一些查詢方法比較適合.
????????PROPAGATION_MANDATORY: 強制要求當前存在一個事務, 如果不存在則拋出異常.
????????PROPAGATION_REQUIRES_NEW: 不管當前是否存在事務, 都會創(chuàng)建新的事務. 如果當前存在事務, 會將當前的事務掛起. 如果某個業(yè)務對象所做的事情不想影響到外層事務,如日志, 就算報錯也不想當前業(yè)務方法回滾.
????????PROPAGATION_NOT_SUPPORTED: 不支持當前事務, 在沒有事務的情況下執(zhí)行. 如果當前存在事務, 當前事務原則上會掛起. 之所以說原則上, 需要看對應的PlatformTransactionManager實現(xiàn)類是否支持事務的掛起.
????????PROPAGATION_NEVER: 永遠不需要事務, 如果存在當前事務, 則拋出異常.
????????PROPAGATION_NESTED: 如果存在當前事務, 則在當前事務的一個嵌套事務中執(zhí)行, 否則與PROPAGATION_REQUIRED的行為類似.
org.springframework.transaction.support.DefaultTransactionDefinition是TransactionDefinition接口的默認實現(xiàn)類, 提供了各事務的默認熟悉,? 并且通過它的setter方法, 可以更改這些屬性.