spring如何管理事務

2021-06-22 07:02:53 字數 3744 閱讀 5401

spring提供的事務管理可以分為兩類:

程式設計式的和宣告式的。程式設計式的,比較靈活,但是**量大,存在重複的**比較多;宣告式的比程式設計式的更靈活方便。 

1、傳統使用

jdbc

的事務管理 

以往使用jdbc

進行資料操作,使用

datasource

,從資料來源中得到

connection

,我們知道資料來源是執行緒安全的,而連線不是執行緒安全的,所以對每個請求都是從資料來源中重新取出乙個連線。一般的資料來源由容器進行管理,包括連線池。例如 

tomcat

,websphere

,weblogic

等這些j2ee

商業容器都提供了這個功能。 

以往的我們使用jdbc

在寫**時,事務管理可能會是這樣: 

connection conn = null; 

trycatch(exception e) 

finally catch(sqlexception se) 

//close resultset,preparedstatement,connection 

//notice:maybe ocurr exception when u close rs,pstmt,conn 

} 按照以往的思路來寫**,**量比較長,而且容易疏忽,忘掉一些try/catch

,引發一些異常無法

catch

,雖然有時候我們會寫

dbtool

類,來關閉這些資源,並且保證在關閉這些資源時,不向外拋異常,但是這樣做會導致額外的麻煩。 2、

spring

提供的程式設計式的事務處理 

spring

提供了幾個關於事務處理的類:

transactiondefinition //

事務屬性定義 

transcationstatus //

代表了當前的事務,可以提交,回滾。 

platformtransactionmanager

這個是spring

提供的用於管理事務的基礎介面,其下有乙個實現的抽象類 

abstractplatformtransactionmanager

,我們使用的事務管理類例如 

datasourcetransactionmanager

等都是這個類的子類。 

我們使用程式設計式的事務管理流程可能如下: 

(1) 

宣告資料來源。 

(2) 宣告乙個事務管理類,例如:

datasourcetransactionmanager,hibernatetransactionmanger,jtatransactionmanager

等 (3) 在我們的**中加入事務處理**: 

transactiondefinition td = new transactiondefinition(); 

transactionstatus ts = transactionmanager.gettransaction(td); 

trycatch(exception e) 

使用spring

提供的事務模板

transactiontemplate

: void add()  } 

} transactiontemplate

也是為我們省去了部分事務提交、回滾**;定義事務模板時,需注入事務管理物件。 3、

spring

宣告式事務處理 

spring

宣告式事務處理也主要使用了

ioc,

aop思想,提供了

transactioninterceptor

***和常用的**類

transactionproxyfactorybean

,可以直接對元件進行事務**。 

使用transactioninterceptor

的步驟: 

(1)定義資料源,事務管理類 

(2)定義事務***

,例如: 

<bean id = "transactioninterceptor" 

class="org.springframework.transaction.interceptor.transactioninterceptor"> 

<property name="transactionmanager"

><ref bean="transactionmanager"/

></property

> <property name="transactionattributesource"

> <value

> com.test.usermanager.*r=propagation_required 

</value

> </property

> </bean

> (3

)為元件宣告乙個**類:

proxyfactorybean 

<bean id="usermanager" class="org.springframework.aop.framework.proxyfactorybean"

> <property name="proxyinte***ces"

><value

>com.test.usermanager

</value

></property

> <property name="interceptornames"

> <list

> <idref local="transactioninterceptor"/

> </list

> </property

> </bean

> 使用transactionproxyfactorybean

: <bean id="usermanager" 

class="org.springframework.transaction.interceptor.transactionproxyfactorybean"> 

<property name="transactionmanager"

><ref bean="transactionmanager"/

></property

> <property name="target"

><ref local="usermanagertarget"/

></property

> <property name="transactionattributes"

> <props

> <prop key="insert*"

>propagation_required

</prop

> <prop key="update*"

>propagation_required

</prop

> <prop key="*"

>propagation_required,readonly

</prop

> </props

> </property

> </bean

> transactionproxyfactorybean

只是為元件的事務**,如果我們要給元件新增一些業務方面的驗證等,可以使用 

transactiontemplate

加***方式,為元件新增多個***,

spring aop

中提供了三類

advice,

即前增強,後增強,丟擲異常時的增強,可以靈活使用。

Spring管理事務

spring管理事務 platfromtransactionmanager 平台管理事務 幫助我們管理任意平台的事務 jdbc datasourcetransactionmanager hibernate hibernatetransactionmanager transactionmanager ...

spring 管理事務

spring 管理事務 管理切面類 事務的回滾,提交 spring提供的 事務管理器 之前,之後,拋異常時 spring提供的 事務 切入點 目標類中的方法 我們自己篩選 帶著切面類中的 動態織入到切入點上 事務 帶著事務管理器中的 動態織入到切入點上 spring與jdbc結合事務的管理 1.通過...

spring 註解管理事務

spring 註解管理事務 註解事務管理 參考 xmlns xmlns xsi xmlns context xmlns aop xmlns tx xmlns p xsi schemalocation spring beans 3.2.xsd spring context 3.2.xsd spring...