spring事務處理

2022-07-10 08:51:14 字數 3021 閱讀 7217

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...