一、事務概要
一個數據庫事務通常包含了多個對數據庫的讀/寫操作,它存在包含兩個目的:
1、爲數據庫操作提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
2、當多個應用程序在併發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
所以事務是用來處理異常和併發問題的
二、Spring事務
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。 Spring支持編程式事務和聲明式事務策略,一般都推薦採用聲明式事務策略。
1、編程式事務:PlatformTransactionManager或TransactionTemplate(推薦)。
2、聲明式事務(1、基於 xml 配置,2、基於註解):使用TransactionProxyFactoryBean來配置事務代理Bean,它是一個專門爲目標Bean生成事務代理的工廠Bean(事務代理的方法改寫了目標Bean的方法,就是在目標Bean的方法執行之前加入開始事務,在目標Bean的方法正常結束之前提交事務,如果遇到特定異常則回滾)。Spring的聲明式事務策略是基於Spring AOP的。
Spring中關於事務配置總是由三個組成部分:分別是DataSource、TransactionManager和代理機制這三部分。無論哪種配置方式,一般變化的只是代理機制這部分。DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化,比如使用Hibernate進行數據訪問時,DataSource實際爲SessionFactory,TransactionManager的實現爲HibernateTransactionManager。
3、Spring支持7種事務傳播規則。
4、Spring事務管理是通過AOP實施事務增強(基於接口代理或動態字節碼技術)。
基於接口動態代理的AOP事務增強,接口方法必須都是public的,實現類的方法也必須都是public的,不能夠有protected、private、final。
基於CGLib字節碼動態代理的方案是通過擴展被增強類,動態創建子類的方式進行AOP增強植入的,由於final、static、private修飾的方法不能夠被子類覆蓋就無法實施AOP增強。
5、filter和interceptor區別:
過濾器(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: