1. 程式人生 > >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 事務的使用有一定的掌握。

四、不足

本系列只講解了單資料庫的事務,後續會嘗試分析分散式事務的實測。