Spring 事务

什么是事务处理我就不想回答了。 Spring 的事务处理,可以说是 Spring AOP 的一种实现。因为事务处理是所谓方面( Aspect )的一个子集。因此默认情况下,事务处理是利用 Java 动态代理机制实现的,这样就必须先定义一个接口,然后再编写实现;而对于没有接口的 Javabean ,则通过 CGLIB 实现。这部分是 Spring AOP 部分的内容。

2 、两种事务处理方式
和 EJB 一样, Spring 也提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理。

何时使用什么
如果需要大量的事务处理,就用声明式事务处理,如果很少的事务处理,就用编程式

二、详细
编程式事务处理与声明式事务处理

(一)编程式事务处理
1 、使用TransactionTemplate进行事务处理(Spring进行commit和rollback)
( 1 )使用事务处理的类



import javax.sql.DataSource;

import org.springframework.jdbc.core.*;

import org.springframework.transaction.*;

import org.springframework.dao.*;



public class bookDAO{

private DataSource dataSource;// 依赖注入 dataSource ,管理数据库

private PlatformTransationManager transactionManager;// 依赖注入管理事务



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);

// 调用 transactionTemplate 的 execute 方法进行事务管理

Object result= transactionTemplate.execute (

// 这是一个回调函数,实现了 TransactionCallback 接口的 doInTransaction 方法,就是在这个方法里写数据库新增数据的操作

new TransactionCallback()

{

public Object doInTransaction(TransactionStatus status)

{

// 数据库操作代码

return resultObject;

}

}

[U1] )

}

}

如果不想返回结果( resultObject ),则可以用 TransactionCallbackWithoutResult 来实现 TransactionCallback 接口,代码如下:

new TransactionCallback WithoutResult ()

{

public Object doInTransaction WithoutResult (TransactionStatus status)

{

// 数据库操作代码



}

}



( 2 )配置文件

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

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

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

<beans>

<!— 设 定dataSource à

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

<!— 使用SQL Server 数 据 库 à

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



<!— 设定 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 就可以自动进行 commit 和 rollback 这两个操作了。粉色部分是为了和 bookDAO 中的粉色部分相匹配。

2 、使用JdbcTemplate进行事务处理(硬编码进行commit和rollback)
( 1 )使用事务处理的类



import javax.sql.DataSource;

import org.springframework.jdbc.core.*;

import org.springframework.transaction.*;

import org.springframework.dao.*;



public class bookDAO{

private DataSource dataSource;// 依赖注入 dataSource ,管理数据库

private PlatformTransationManager transactionManager;// 依赖注入管理事务



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 )配置文件

同上



( 二)声明式事务处理
( 1 )使用事务处理的类



import javax.sql.DataSource;

import org.springframework.jdbc.core.*;

import org.springframework.transaction.*;

import org.springframework.dao.*;



public class bookDAO{

private DataSource dataSource;// 依赖注入 dataSource ,管理数据库

private PlatformTransationManager transactionManager;// 依赖注入管理事务



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 事务处理语句;与 ① 相比,不必实现 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>

<!— 设 定dataSource à

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

<!— 使用SQL Server 数 据 库 à

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



<!— 设定 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>

<!— 与编程式事务处理相比,在 DAO 设置中去掉了这个属性,把它放到了代理类中。 - à



<!— <property name=”transactionManager”>

<ref bean=”transactionManager”>

</property> - à



</bean>

<!— 声明式事务处理 - à

<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 方法进行事务处理,并指明当前没有事务就新建一个(用 PROPAGATION_REQUIRED 常量来表示的) à

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

</props>

</property>

</bean>

</beans>
weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值