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。
2. 七大傳播機制概念圖如下:
二、原始碼風格
這裡我們主要看Juergen Hoeller的原始碼風格,發現他很好的遵循了Spring的一貫風格:
1.預留方法給customer自己定義擴充,Spring一貫喜歡預留各種後門...
2.利用各種設計模式:
1)template模板模式:構造事務模板,程式設計式事務原始碼
2)代理模式:生成增強代理類,宣告式事務原始碼
3. Spring-AOP MethodInterceptor方法攔截器:申明式事務中使用TransactionInterceptor
4. 面向介面程式設計,高度抽象:PlatformTransactionManager介面定義getTransaction、commit、rollback。AbstractPlatformTransactionManager抽象類實現通用的獲取事務、提交事務、回滾事務。DataSourceTransactionManager繼承抽象類,並實現特性介面。
當然看過spring transaction包,除了Spring的一貫風格外,最大的體會是註釋豐富,日誌豐富(尤其是debug,甚至不需要debug光看日誌就可以清晰知道核心流程)。勉之。
三、應用
本系列針對Spring+Mybatis+Mysql,講解了2種典型的事務的實現方案(資料庫事務採用DataSourceTransactionManager來管理事務,支援JDBC驅動,通過Connection和資料庫進行互動。):
1.程式設計式事
2.申明式事務
並測試了4種隔離級別和7種傳播機制。相信通過實測,大家對spring 事務的使用有一定的掌握。
四、不足
本系列只講解了單資料庫的事務,後續會嘗試分析分散式事務的實測。