spring兩種事務處理機制,一是宣告式事務,二是程式設計式事務
宣告式事務
1)spring的宣告式事務管理在底層是建立在aop的基礎之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入乙個事務,在執行完目標方法之後根據執**況提交或者回滾事務。宣告式事務最大的優點就是不需要通過程式設計的方式管理事務,這樣就不需要在業務邏輯**中摻雜事務管理的**,只需在配置檔案中做相關的事務規則宣告(或通過等價的基於標註的方式),便可以將事務規則應用到業務邏輯中。因為事務管理本身就是乙個典型的橫切邏輯,正是aop的用武之地。spring開發團隊也意識到了這一點,為宣告式事務提供了簡單而強大的支援。spring強大的宣告式事務管理功能,這主要得益於spring依賴注入容器和spring aop的支援。依賴注入容器為宣告式事務管理提供了基礎設施,使得bean對於spring框架而言是可管理的;而spring aop則是宣告式事務管理的直接實現者。和程式設計式事務相比,宣告式事務唯一不足地方是,後者的最細粒度只能作用到方法級別,無法做到像程式設計式事務那樣可以作用到**塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的**塊獨立為方法等等。
2)5種配置方式
spring配置檔案中關於事務配置總是由三個組成部分,分別是datasource、transactionmanager和**機制這三部分,無論哪種配置方式,一般變化的只是**機制這部分。
datasource、transactionmanager這兩部分只是會根據資料訪問方式有所變化,比如使用hibernate進行資料訪問時,datasource實際為sessionfactory,transactionmanager的實現為hibernatetransactionmanager。
關係圖如下:
步驟一、在spring配置檔案中引入命名空間
步驟二、具有@transactional 註解的bean自動配置為宣告式事務支援
步驟三、在介面或類的宣告處 ,寫乙個@transactional.
要是只在介面上寫, 介面的實現類就會繼承下來、介面的實現類的具體方法,可以覆蓋類宣告處的設定
@transactional //類級的註解、適用於類中所有的public的方法
事務的傳播行為和隔離級別
大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。
事務註解方式: @transactional
當標於類前時, 標示類中所有方法都進行事務處理 , 例子:
@transactional
public class testservicebean implements testservice {}
當類中某些方法不需要事務時:
@transactional
public class testservicebean implements testservice
@transactional(propagation = propagation.not_supported)
public listgetall()
}事務傳播行為介紹:
@transactional(propagation=propagation.required)
如果有事務, 那麼加入事務, 沒有的話新建乙個(預設情況下)
@transactional(propagation=propagation.not_supported)
容器不為這個方法開啟事務
@transactional(propagation=propagation.requires_new)
不管是否存在事務,都建立乙個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
@transactional(propagation=propagation.mandatory)
必須在乙個已有的事務中執行,否則丟擲異常
@transactional(propagation=propagation.never)
必須在乙個沒有的事務中執行,否則丟擲異常(與propagation.mandatory相反)
@transactional(propagation=propagation.supports)
如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.
事務超時設定:
@transactional(timeout=30) //預設是30秒
事務隔離級別:
@transactional(isolation = isolation.read_uncommitted)
讀取未提交資料(會出現髒讀, 不可重複讀) 基本不使用
@transactional(isolation = isolation.read_committed)
讀取已提交資料(會出現不可重複讀和幻讀)
@transactional(isolation = isolation.repeatable_read)
可重複讀(會出現幻讀)
@transactional(isolation = isolation.serializable)
序列化
mysql: 預設為repeatable_read級別
sqlserver: 預設為read_committed
髒讀 : 乙個事務讀取到另一事務未提交的更新資料
不可重複讀 : 在同一事務中, 多次讀取同一資料返回的結果有所不同, 換句話說,
後續讀取可以讀到另一事務已提交的更新資料. 相反, "可重複讀"在同一事務中多次
讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料
幻讀 : 乙個事務讀到另乙個事務已提交的insert資料。
程式設計式事務
spring的程式設計式事務即在**中使用程式設計的方式進行事務處理,可以做到比宣告式事務更細粒度。有兩種方式一是使用transactionmanager,另外就是transactiontemplate。
spring事務處理
一 spring 事務處理 1 事務的處理也交給了 spring 來管理,要在 檔案中上配置事務管理類 實施事務管理的 bean class org.springframwork.orm.hibernate3.hibernatetransactionmanager 它是通過 sessionfacto...
spring事務處理
xml 實施事務管理的bean bean id transactionmanager class org.springframwork.orm.hibernate3.hibernatetransactionmanager property name sessionfactory refbean se...
spring事務處理
一.spring事務分為宣告式事務和程式設計式事務 二 程式設計式事務可以作用在 庫,示例 autowired private org.springframework.jdbc.datasource.datasourcetransactionmanager transactionmanager pu...