一個數據庫事務一般包含了多個對數據庫的讀/寫操做,它存在包含兩個目的:
1、爲數據庫操做提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即便在異常狀態下仍能保持一致性的方法。
2、當多個應用程序在併發訪問數據庫時,能夠在這些應用程序之間提供一個隔離方法,以防止彼此的操做互相干擾。spring
因此事務是用來處理異常和併發問題的數據庫
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是沒法提供事務功能的。 Spring支持編程式事務和聲明式事務策略,通常都推薦採用聲明式事務策略。編程
一、編程式事務:PlatformTransactionManager或TransactionTemplate(推薦)。併發
二、聲明式事務(1、基於 xml 配置,2、基於註解):使用TransactionProxyFactoryBean來配置事務代理Bean,它是一個專門爲目標Bean生成事務代理的工廠Bean(事務代理的方法改寫了目標Bean的方法,就是在目標Bean的方法執行以前加入開始事務,在目標Bean的方法正常結束以前提交事務,若是遇到特定異常則回滾)。Spring的聲明式事務策略是基於Spring AOP的。框架
Spring中關於事務配置老是由三個組成部分:分別是DataSource、TransactionManager和代理機制這三部分。不管哪一種配置方式,通常變化的只是代理機制這部分。DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,好比使用Hibernate進行數據訪問時,DataSource實際爲SessionFactory,TransactionManager的實現爲HibernateTransactionManager。spa
三、Spring支持7種事務傳播規則。.net
四、Spring事務管理是經過AOP實施事務加強(基於接口代理或動態字節碼技術)。3d
基於接口動態代理的AOP事務加強,接口方法必須都是public的,實現類的方法也必須都是public的,不可以有protected、private、final。
基於CGLib字節碼動態代理的方案是經過擴展被加強類,動態建立子類的方式進行AOP加強植入的,因爲final、static、private修飾的方法不可以被子類覆蓋就沒法實施AOP加強。代理
五、filter和interceptor區別:orm
過濾器(filter)和攔截器(interceptor,就是AOP的一種實現策略)主要區別以下:
a、兩者適用範圍不一樣。Filter是Servlet規範規定的,只能用於Web程序中,而攔截器既能夠用於Web程序,也能夠用於Application、Swing程序中。
b、規範不一樣。Filter是在Servlet規範定義的,是Servlet容器支持的,而攔截器是在Spring容器內的,是Spring框架支持的。
c、使用的資源不一樣。同其餘代碼塊同樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,所以能使用Spring裏的任何資源、對象(各類bean),而Filter不行。
d、深度不一樣。Filter只在Servlet先後起做用,而攔截器可以深刻到方法先後、異常跑出先後等,攔截器的使用有更大的彈性。
Ref: