Spring事務原理
Spring框架支持對于事務的管理功能,開發人員使用Spring框架能極大的簡化對于數據庫事務的管理操作,不必進行手動開啟事務,提交事務,回滾事務,就是在配置文件或者項目的啟動類配置Spring事務相關的注解驅動,使用@Transaction注解即可,既開啟并使用Spring事務管理功能
Spring事務分類
通過Spring管理的事務可以分為邏輯事務和物理事務兩大類
- 邏輯事務:通過指通過Spring等框架管理的事務,這種事務建立在物理事務之上,比物理事務更加抽象
- 物理事務:通常指的是針對特定數據庫的事務
Spring支持兩種事務聲明式方式,分別是編程式事務和聲明式事務
- 編程式事務:如果系統需要明確事務,并且需要細粒度的控制各個事務的邊界,此時建議使用編程式事務
- 聲明式事務:如果系統對事務的控制粒度比較粗糙,則建議使用聲明式事務
Spring的事務三大接口
- PlatformTransactionManager接口:為Hibernate、Mybatis、JTA等持久化框架提供事務管理器,具體的實現由框架自己實現
- TransactionDefinition接口:主要定義和事務相關的方法,表示事務屬性的常量等信息。部分事務屬性的常量和Propagation枚舉類中的事務傳播類型相對應
- TransactionStatus接口:主要用來存儲事務執行的狀態,并且定義了一組方法,用于判斷或者讀取事務的狀態信息
Spring事務隔離級別???????
Spring中存在5中隔離級別主要為:
- ISOLATION_DEFAULT:該級別是Spring中默認的事務隔離級別
- ISOLATION_READ_UNCOMMITTED(讀未提交):是Spring中最低的隔離級別,事務A能夠讀取到事務B未提交的數據,會出現臟讀、不可重復讀、幻讀
- ISOLATION_READ_COMMITTED(讀已提交):可以保證事務A的只有事務提交后事務B才能讀取到事務A的數據,會出現不可重復讀、幻讀
- ISOLATION_REPEABLE_READ(可重復讀):可以保證不會出現臟讀和不可重復讀的問題,但是會出現幻讀的問題
- ISOLATION_SERIALIZABLE(可串行化):事務只能按照特定的順序執行,多個事務之間只能按照串行化的順序執行,這個是最可靠的隔離級別,并發性最差
Spring事務傳播機制(7種)
?????????支持當前事務的事務傳播機制:REQUIRED、SUPPORTS、MANDATORY
????????不支持當前事務的事務傳播機制:REQUIRED_NEW、NOT_SUPPORTS、NEVER
????????嵌套事務機制:NESTED
注意點:枚舉類Propagation集合@Transaction注解使用,枚舉類中定義的事務傳播行為類型與TransactionDefinition接口定義的事務傳播類型相對應,在使用@Transaction注解時,使用的是Propagation枚舉類中的事務傳播類型,而不是直接使用TransactionDefinition接口中定義的事務傳播類型
- REQUIRED事務傳播類型:表示當前沒有事務,就創建一個事務,如果已經存在一個事務,就加入這個事務,Spring默認的事務傳播類型
- REQUIRES_NEW事務傳播類型:表示當前存在事務,則把當前事務掛起,并重新創建新的事務并執行,直到新的事務提交或者回滾,才會恢復執行原來的事務。原有事務跟新事務互不影響
- SUPPORTS事務傳播類型:表示支持當前事務,如果當前沒有事務,就以非事務的方式執行
- MANDATORY:表示支持當前事務,這種事務傳播類型具備強制性,當前操作必須存在事務,如果不存在,則拋出異常
- NOT_SUPPORTED事務傳播類型:表示當前以非事務方式執行,如果當前操作在一個事務中,則把當前事務掛起,直到當前操作完成在恢復事務的執行。
- NEVER事務傳播類型:表示以非事務的方式執行,如果當前操作存在事務,則拋出異常
- NESTED事務傳播類型:表示如果當前方法中有一個事務正在運行,則這個方法應該運行在一個嵌套事務中,被嵌套的事務可以獨立于被封裝的事務進行提交或者回滾,如果沒有活動事務,則按照REQUIRED事務傳播類型執行
Srping中常用的事務傳播類型
????????7種事務傳播機制類型,日常工作上主要使用只有REQUIRED、NOT_SUPPORTED、REQUIRES_NEW三種
????????REQUIRED:Spring中默認的傳播機制,適用于大部分場景
????????NOT_SUPPORTED:適用于發送提示信息、站內信、短信、郵件等,這類場景要求不影響系統的主體業務邏輯,即使操作失敗也不應該對主體邏輯產生影響,不能使主體邏輯的事務回滾
????????REQUIRES_NEW:總是創建新的事務執行,適用于不受外層方法事務影響的場景。例如記錄日志的操作,不管主體業務邏輯是否已經完成,日志都要記錄下來,不能因為主體業務邏輯異常事務回滾導致日志記錄不到
Spring 事務失效的場景
- 數據庫不支持事務:Spring事務生效的前提是連接的數據庫支持事務,如果底層不支持事務,則Spring的事務肯定會失效,例如Mysql的MyISAM存儲引擎
- 事務方法沒有被Spring管理:事務方法所在的類沒有加載到Spring IOC容器中,事務方法所在的類沒有被Spring管理,則食物會失效
- 方法沒有被public修飾:此時事務也會失效
- 同一個類中的方法調用:如果同一個類的方法A上添加了事務注解,方法B上添加了事務注解,方法A調用方法B,則方法B的事務會失效
- 未配置事務管理器:如果在項目中沒有配置Spring的事務管理器,即使使用了Spring的事務管理功能,Spring的事務也不會生效
- 方法的事務傳播類型不支持事務:如果內部方法的事務傳播為不支持事務傳播類型,則內部方法的事務在Spring中會失效
- 不正確的捕獲異常:如果自己把異常給吃了,那將會導致事務的失效
- 標準錯誤的異常類型:Spring中默認回滾的事務異常類型為RuntimeException,如果拋出的異常不是RuntimeException 或者其子類,事務將失效