溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring 的事務(wù)處理

發(fā)布時(shí)間:2020-07-20 17:15:13 來源:網(wǎng)絡(luò) 閱讀:314 作者:沙漏半杯 欄目:編程語言

一、概述

(一)基本概念

1 、什么是Spring事務(wù)處理?

什么是事務(wù)處理我就不想回答了。 Spring 的事務(wù)處理,可以說是 Spring AOP 的一種實(shí)現(xiàn)。因?yàn)槭聞?wù)處理是所謂方面( Aspect )的一個(gè)子集。因此默認(rèn)情況下,事務(wù)處理是利用 Java 動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn)的,這樣就必須先定義一個(gè)接口,然后再編寫實(shí)現(xiàn);而對于沒有接口的 Javabean ,則通過 CGLIB 實(shí)現(xiàn)。這部分是 Spring AOP 部分的內(nèi)容。


2 、兩種事務(wù)處理方式

和 EJB 一樣, Spring 也提供兩種事務(wù)處理方式,一種是編程式事務(wù)處理;一種是聲明式事務(wù)處理。


(二)框架圖

實(shí)現(xiàn)事務(wù)處理的兩種方式


Java 動(dòng)態(tài)代理


CGLIB


?


兩種事務(wù)處理方式


編程式事務(wù)處理


聲明式事務(wù)處理


?


(三)何時(shí)使用什么

? ? ? ? ? 如果需要大量的事務(wù)處理,就用聲明式事務(wù)處理,如果很少的事務(wù)處理,就用編程式


二、詳細(xì)

? ? ? ? ? ? ? 編程式事務(wù)處理與聲明式事務(wù)處理


(一)編程式事務(wù)處理

1 、使用TransactionTemplate進(jìn)行事務(wù)處理(Spring進(jìn)行commit和rollback)

? ? ? ? ? ( 1 )使用事務(wù)處理的類


?


import javax.sql.DataSource;


import org.springframework.jdbc.core.*;


import org.springframework.transaction.*;


import org.springframework.dao.*;


?


public class bookDAO{


private DataSource dataSource;// 依賴注入 dataSource ,管理數(shù)據(jù)庫


private PlatformTransationManager transactionManager;// 依賴注入管理事務(wù)


?


public void setDataSource(DataSource dataSource){


? ? this.dataSource=dataSource;


}


?


? ? ?public void setTransactionManager(PlatformTransationManager transactionManager){


? ? ? ? ?this. transactionManager= transactionManager;


}


?


public int create(String msg){


? ? TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);


? ? // 調(diào)用 transactionTemplate 的 execute 方法進(jìn)行事務(wù)管理


? ? Object result= transactionTemplate.execute (


? ? ?// 這是一個(gè)回調(diào)函數(shù),實(shí)現(xiàn)了 TransactionCallback 接口的 doInTransaction 方法,就是在這個(gè)方法里寫數(shù)據(jù)庫新增數(shù)據(jù)的操作


? ? ? ? ? new TransactionCallback()


{


? ? ? ? ? public Object doInTransaction(TransactionStatus status)


{


? ? ? ? ? ? ? // 數(shù)據(jù)庫操作代碼


? ? ? ? ? ? ? return resultObject;


? ? ? ? ? ?}


? ? ? ?}


[U1]? ? ? ?)


}


}


如果不想返回結(jié)果( resultObject ),則可以用 TransactionCallbackWithoutResult 來實(shí)現(xiàn) TransactionCallback 接口,代碼如下:


? ? ? ? new TransactionCallback WithoutResult ()


{


? ? ? ? ? public Object doInTransaction WithoutResult (TransactionStatus status)


{


? ? ? ? ? ? ? // 數(shù)據(jù)庫操作代碼


? ? ? ? ? ??


? ? ? ? ? ?}


? ? ? ?}


?


( 2 )配置文件


<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"


?"http://www.springframework.org/dtd/spring-beans.dtd">


<beans>


? ?<!— 設(shè) 定dataSource à


? ?<bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>


? ? ? <!— 使用SQL Server 數(shù) 據(jù) 庫 à


? ? ? ?<property name=”driverClassName”>


? ? ? ? ? <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>


? ? ? ?</property>


? ? ? ? <property name=”url”>


? ? ? ? ? <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>


? ? ? ?</property>


<property name=”name”>


? ? ? ? ? <value>admin</value>


? ? ? ?</property>


<property name=”msg”>


? ? ? ? ? <value>admin</value>


? ? ? ?</property>


? ? </bean>


?


? ? <!— 設(shè)定 transactionManager à


? ? <bean id=”transactionManager”


class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>


? ? ? ? <property name=”dataSource”>


? ? ? ? ? ? <ref bean=”dataSource”/>


? ? ? ? </property>


? ? </bean>


?


? ?<!— 示例中 DAO-->


? ? <bean id=”bookDAO” class=”com.bookDAO”>


? ? ? ? <property name=”dataSource”>


? ? ? ? ? ? <ref bean=”dataSource”/>


? ? ? ? </property>


? ? ? ? <property name=”transactionManager”>


? ? ? ? ? ? <ref bean=”transactionManager”>


? ? ? ? </property>


? ?</bean>


</beans>


? ?這樣 Spring 就可以自動(dòng)進(jìn)行 commit 和 rollback 這兩個(gè)操作了。粉色部分是為了和 bookDAO 中的粉色部分相匹配。


2 、使用JdbcTemplate進(jìn)行事務(wù)處理(硬編碼進(jìn)行commit和rollback)

( 1 )使用事務(wù)處理的類


?


import javax.sql.DataSource;


import org.springframework.jdbc.core.*;


import org.springframework.transaction.*;


import org.springframework.dao.*;


?


public class bookDAO{


private DataSource dataSource;// 依賴注入 dataSource ,管理數(shù)據(jù)庫


private PlatformTransationManager transactionManager;// 依賴注入管理事務(wù)


?


public void setDataSource(DataSource dataSource){


? ? this.dataSource=dataSource;


}


?


? ? ?public void setTransactionManager(PlatformTransationManager transactionManager){


? ? ? ? ?this. transactionManager= transactionManager;


}


?


public int create(String msg){


? /*? TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);


? ? ? Object result= transactionTemplate.execute (


? ? ? ?new TransactionCallback()


{


? ? ? ? ? public Object doInTransaction(TransactionStatus status)


{


?


? ? ? ? ? ? ? return resultObject;


? ? ? ? ? ?}


? ? ? ?}


? ? )*/


? // 使用下面的代碼替換上面注釋掉的部分


? ? DefaultTransactionDefinition def =new DefaultTransactionDefinition();


? ?TransactionStatus status=transactionManager.getTransaction(def);


? ?try


{


? ? ? ? JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);


? ? ? ? jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);


? ?}


? ?catch(DataAccessException ex)


{


? ? ? ?transactionzManager.rollback(status);


? ? ? ?throw ex;


? ?}


? ?finally


? ?{


? ? ? ? transactionManager.commit(status);


? ?}


}


}


( 2 )配置文件


同上


?


( 二)聲明式事務(wù)處理

( 1 )使用事務(wù)處理的類


?


import javax.sql.DataSource;


import org.springframework.jdbc.core.*;


import org.springframework.transaction.*;


import org.springframework.dao.*;


?


public class bookDAO{


private DataSource dataSource;// 依賴注入 dataSource ,管理數(shù)據(jù)庫


private PlatformTransationManager transactionManager;// 依賴注入管理事務(wù)


?


public void setDataSource(DataSource dataSource){


? ? this.dataSource=dataSource;


}


?


? ? ?public void setTransactionManager(PlatformTransationManager transactionManager){


? ? ? ? ?this. transactionManager= transactionManager;


}


?


public int create(String msg){


? ① /*? TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);


? ? ? Object result= transactionTemplate.execute (


? ? ? ?new TransactionCallback()


{


? ? ? ? ? public Object doInTransaction(TransactionStatus status)


{


?


? ? ? ? ? ? ? return resultObject;


? ? ? ? ? ?}


? ? ? ?}


? ? )*/


?


② /*? DefaultTransactionDefinition def=new DefaultTransactionDefinition();


? ?TransactionStatus status=transactionManager.getTransaction(def);


? ?try


{


? ? ? ? JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);


? ? ? ? jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);


? ?}


? ?catch(DataAccessException ex)


{


? ? ? ?transactionzManager.rollback(status);


? ? ? ?throw ex;


? ?}


? ? finally


? ?{


? ? ? ?transactionManager.commit(status);


? ?} */


// 使用下面的代碼替換上面注釋掉的部分


? ? ?JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);


? ? jdbcTemplate.update(“INSERT INFO book VALUES(1,’gf’,’Mastering Spring’)”);


/ / 與 ② 相比,此段代碼省去了 commit 和 rollback 事務(wù)處理語句;與 ① 相比,不必實(shí)現(xiàn) TransactionCallback 接口


}


}


( 2 )配置文件


<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"


?"http://www.springframework.org/dtd/spring-beans.dtd">


<beans>


? ?<!— 設(shè) 定dataSource à


? ?<bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>


? ? ? <!— 使用SQL Server 數(shù) 據(jù) 庫 à


? ? ? ?<property name=”driverClassName”>


? ? ? ? ? <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>


? ? ? ?</property>


? ? ? ? <property name=”url”>


? ? ? ? ? <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>


? ? ? ?</property>


<property name=”name”>


? ? ? ? ? <value>admin</value>


? ? ? ?</property>


<property name=”msg”>


? ? ? ? ? <value>admin</value>


? ? ? ?</property>


? ? </bean>


?


? ? <!— 設(shè)定 transactionManager à


? ? <bean id=”transactionManager”


class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>


? ? ? ? <property name=”dataSource”>


? ? ? ? ? ? <ref bean=”dataSource”/>


? ? ? ? </property>


? ? </bean>


?


? ?<!— 示例中 DAO-->


? ? <bean id=”bookDAO” class=”com.bookDAO”>


? ? ? ? <property name=”dataSource”>


? ? ? ? ? ? <ref bean=”dataSource”/>


? ? ? ? </property>


? ? <!— 與編程式事務(wù)處理相比,在 DAO 設(shè)置中去掉了這個(gè)屬性,把它放到了代理類中。 - à


?


? ? <!—? ? <property name=”transactionManager”>


? ? ? ? ? ? <ref bean=”transactionManager”>


? ? ? ? </property> - à


?


? ?</bean>


? ?<!— 聲明式事務(wù)處理 - à


? ?<bean id=”bookDAOProxy” class=”org.springframework.transaction.interceptor.Transation.ProxyFactoryBean”>


? ? ? ? <property name=”transacionManager”>


? ? ? ? ? ? <ref bean=”transacionMaganer”/>


? ? ? ? </property>


<property name=”target”>


? ? ? ? ? ? <ref bean=”bookDAO”/>


? ? ? ? </property>


<property name=”transactionAttributes”>


? ? ? ? ? ? <props>


? ? ? ? ? ? ? ?<!-- 表示對 bookDAO 中的 create 方法進(jìn)行事務(wù)處理,并指明當(dāng)前沒有事務(wù)就新建一個(gè)(用 PROPAGATION_REQUIRED 常量來表示的) à


? ? ? ? ? ? ? ? <prop key=”create * ”>PROPAGATION_REQUIRED</prop>


? ? ? ? ? ? </props>


? ? ? ? </property>??


? ?</bean>


</beans>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI