javascript
Spring事务的实现方式和实现原理
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。Spring只提供統一事務管理接口,具體實現都是由各數據庫自己實現,數據庫事務的提交和回滾是通過binlog或者undo?log實現的。Spring會在事務開始時,根據當前環境中設置的隔離級別,調整數據庫隔離級別,由此保持一致。
(1)Spring事務的種類:
spring支持編程式事務管理和聲明式事務管理兩種方式:
①編程式事務管理使用TransactionTemplate。
②聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前啟動一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。
?
聲明式事務最大的優點就是不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明或通過@Transactional注解的方式,便可以將事務規則應用到業務邏輯中,減少業務代碼的污染。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。?
(2)spring的事務傳播機制:
spring事務的傳播機制說的是,當多個事務同時存在的時候,spring如何處理這些事務的行為。事務傳播機制實際上是使用簡單的ThreadLocal實現的,所以,如果調用的方法是在新線程調用的,事務傳播實際上是會失效的。
?
① PROPAGATION_REQUIRED:(默認傳播行為)如果當前沒有事務,就創建一個新事務;如果當前存在事務,就加入該事務。
② PROPAGATION_REQUIRES_NEW:無論當前存不存在事務,都創建新事務進行執行。
③ PROPAGATION_SUPPORTS:如果當前存在事務,就加入該事務;如果當前不存在事務,就以非事務執行。‘
④ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
⑤ PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行;如果當前沒有事務,則按REQUIRED屬性執行。
⑥ PROPAGATION_MANDATORY:如果當前存在事務,就加入該事務;如果當前不存在事務,就拋出異常。
⑦ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。?
(3)Spring中的隔離級別:
?
①?ISOLATION_DEFAULT:這是個?PlatfromTransactionManager?默認的隔離級別,使用數據庫默認的事務隔離級別。
②?ISOLATION_READ_UNCOMMITTED:讀未提交,允許事務在執行過程中,讀取其他事務未提交的數據。
③?ISOLATION_READ_COMMITTED:讀已提交,允許事務在執行過程中,讀取其他事務已經提交的數據。
④?ISOLATION_REPEATABLE_READ:可重復讀,在同一個事務內,任意時刻的查詢結果都是一致的。
⑤?ISOLATION_SERIALIZABLE:所有事務逐個依次執行。??
總結
以上是生活随笔為你收集整理的Spring事务的实现方式和实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring的自动装配
- 下一篇: Spring框架中有哪些不同类型的事件