一、spring的事務提供了三個核心接口PlaffromTransactionManager、TransactionDefinition、TransactionStatus
PlaffromTransactionManager該接口主要用于管理事務
一般我們使用時sping的事務會指定一個我們期望用的事務管理器,不然spring會用默認的事務管理器可能無法達到我們的希望效果。
TransactionDefinition接口是事務定義的描述對象,該對象中定義了事務規(guī)則,并獲取食物相關信息的方法。
TransactionStatus接口是事務的狀態(tài)接口
spring的事務提供了統(tǒng)一的事務編程模型
提供了編程式事務和聲明式事務,編程式事務可以精確的定義。
聲明式事務只需要簡單的配置由spring的事務實現(xiàn)。基于aop的實現(xiàn)
事務的傳播行為7個,
REQUIRED需要一個事務
REQUIRES_NEW開啟一個新事務去處理
MANDATORY必須一個事務 不再,不是事務操作異常
NEVER必須不是一個事務不然則報錯
SUPPORTS支持不是一個事務,是事務也行
NOT_SUPPORTED不支持不是一個事務,如果當前線程在一個事務中,則掛起事務
NESTED嵌套的事務,有點像REQUIRED,但是有些區(qū)別
isolation是事務的隔離級別,DEFAULT默認為可重復度,四個級別,串行、可重復讀、讀已提交、讀未提交
事務可能失效的原因
1.如果不是Innodb存儲引擎,innodb和db支持
2.沒有指定rollbackFor參數(shù)。
3. 沒有指定transactionManager參數(shù),默認的transactionManager并不是我期望的,以及一個事務中涉及到了多個數(shù)據(jù)庫。
4. 如果AOP使用了JDK動態(tài)代理,對象內(nèi)部方法互相調(diào)用不會被Spring的AOP攔截,@Transactional注解無效。
5. 如果AOP使用了CGLIB代理,事務方法或者類不是public,無法被外部包訪問到,或者是final無法繼承,@transactional注解無效。
在一個方法中調(diào)用另一個事務操作對于不同的傳播級別:
1.當傳播級別為為REQUIRED時,第一種情況A和B都會回滾。
2.。當傳播級別為RQUIRED_NEW時,第一種情況A可以成功提交,B回滾,第二種情況A回滾,B可以正確提交,二者互不影響。(在A事務捕獲B事務異常的情況下,保證A事務提交)
3.當傳播級別為NESTED時,第一種情況A可以正常提交,B回滾,第二種情況二者都會回滾。