spring事務詳解(五)總結提高


系列目錄

spring事務詳解(一)初探事務

spring事務詳解(二)簡單樣例

spring事務詳解(三)源碼詳解

spring事務詳解(四)測試驗證

spring事務詳解(五)總結提高

一、概念

事務的概念很多,只有對整體有一個把控,才能見微知著。比如一上來直接問REQUIRED,你一定很懵,但了解了大致關系后,就很清晰:Spring事務定義了六大屬性-》其中一個屬性是傳播機制-》REQUIRED是其中一個,默認的傳播機制。梳理出來三張圖,如下:

1.1 框架概覽

對於數據庫事務,國際性認可的標准是ACID,即原子性、一致性、隔離性、持久性。Spring作為一個支持數據庫持久化的框架,定義了六大屬性來實現這四大特性。屬性分別是:事務名稱、隔離級別(4種)、超時時間、是否只讀、傳播機制(7種)、回滾機制。用戶使用時定義其中的一種或幾種,再結合Spring對底層數據庫的驅動,即可實現ACID良好的數據庫操作了。持久化層Spring提供了對Spring -Mybatis的很好的支持,可以輕松對接JDBC事務如下圖:

 

1.2 重點屬性

1. 四大隔離級別對應的可能出現的問題如下圖:

Read Uncommitted < Read Committed < Repeatable Read < Serializable. 從左往右:一致性越來越強,性能越來越低。

官方建議:

Repeatable Read(一致性3星,性能2星)> Read Committed(一致性2星,性能3星) > Read Uncommitted(一致性1星,性能4星) > Serializable(一致性4星,性能1星)。

我的建議:

高並發場景使用Read Committed,低並發場景使用Repeatable Read。其它兩個沒用過(Read Uncommitted一致性太低了;Serializable sql序列化,數據庫會成為瓶頸)。

 

2. 七大傳播機制概念圖如下:

二、源碼風格

這里我們主要看Juergen Hoeller的源碼風格,發現他很好的遵循了Spring的一貫風格:

1.預留方法給customer自己定義擴充,Spring一貫喜歡預留各種后門...

2.利用各種設計模式:

1)template模板模式:構造事務模板,編程式事務源碼

2)代理模式:生成增強代理類,聲明式事務源碼

3. Spring-AOP MethodInterceptor方法攔截器:申明式事務中使用TransactionInterceptor事務攔截器,該類實現了MethodInterceptor接口,繼承自Interceptor接口,最終在業務方法invoke()前后進行增強。

4. 面向接口編程,高度抽象:PlatformTransactionManager接口定義getTransaction、commit、rollback。AbstractPlatformTransactionManager抽象類實現通用的獲取事務、提交事務、回滾事務。DataSourceTransactionManager繼承抽象類,並實現特性接口。

當然看過spring transaction包,除了Spring的一貫風格外,最大的體會是注釋豐富,日志豐富(尤其是debug,甚至不需要debug光看日志就可以清晰知道核心流程)。勉之。

三、應用

本系列針對Spring+Mybatis+Mysql,講解了2種典型的事務的實現方案(數據庫事務采用DataSourceTransactionManager來管理事務,支持JDBC驅動,通過Connection和數據庫進行交互。):

1.編程式事務

2.申明式事務

並測試了4種隔離級別和7種傳播機制。相信通過實測,大家對spring 事務的使用有一定的掌握。

四、不足

本系列只講解了單數據庫的事務,后續會嘗試分析分布式事務的實測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM