spring事務詳解(二)簡單樣例spring
事務的概念不少,只有對總體有一個把控,才能見微知著。好比一上來直接問REQUIRED,你必定很懵,但瞭解了大體關係後,就很清晰:Spring事務定義了六大屬性-》其中一個屬性是傳播機制-》REQUIRED是其中一個,默認的傳播機制。梳理出來三張圖,以下:設計模式
對於數據庫事務,國際性承認的標準是ACID,即原子性、一致性、隔離性、持久性。Spring做爲一個支持數據庫持久化的框架,定義了六大屬性來實現這四大特性。屬性分別是:事務名稱、隔離級別(4種)、超時時間、是否只讀、傳播機制(7種)、回滾機制。用戶使用時定義其中的一種或幾種,再結合Spring對底層數據庫的驅動,便可實現ACID良好的數據庫操做了。持久化層Spring提供了對Spring -Mybatis的很好的支持,能夠輕鬆對接JDBC事務以下圖:併發
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序列化,數據庫會成爲瓶頸)。高併發
這裏咱們主要看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 事務的使用有必定的掌握。
本系列只講解了單數據庫的事務,後續會嘗試分析分佈式事務的實測。