`
liyanhui
  • 浏览: 349437 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 的事务处理 (转载)

阅读更多

Spring 的事务处理

(零雨其蒙原创,转载请注明)

一、概述

(一)基本概念

1 、什么是Spring事务处理?

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

2 、两种事务处理方式

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

(二)框架图

实现事务处理的两种方式

Java 动态代理

CGLIB

 

两种事务处理方式

编程式事务处理

声明式事务处理

 

(三)何时使用什么

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

二、详细

              编程式事务处理与声明式事务处理

(一)编程式事务处理

1 、使用TransactionTemplate进行事务处理(Spring进行commitrollback

          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进行事务处理(硬编码进行commitrollback

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>

 

分享到:
评论

相关推荐

    (转载)自己动手写一个spring

    在Spring中,切面可以定义为通知(advises),即在特定连接点(join points)上执行的代码,比如方法调用前、后或者异常处理。切面通过切点(pointcuts)来定位这些连接点,从而实现跨功能的关注点统一管理。 实现...

    转载 仿百度能力开放平台的spring cloud 微服务框架 ,-open-capacity-platform.zip

    8. **分布式事务**:Spring Cloud Data Flow和Spring Cloud Task可以帮助处理微服务环境中的复杂分布式事务问题。 9. **消息队列**:Spring Cloud Stream和RabbitMQ、Kafka等消息中间件结合,实现异步通信和解耦,...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    在本项目中,Spring可能用于管理portlet的bean,实现服务注入,以及处理事务管理等。 【Hibernate3.3】是ORM(Object-Relational Mapping)框架的一个版本,用于简化Java应用程序与数据库之间的交互。它将Java对象...

    不需要应用服务器的J2EE【转载】

    【不需要应用服务器的J2EE】这一概念主要指的是在开发J2EE应用程序时,不再依赖传统的应用服务器,而是采用轻量级框架,如Spring,来实现业务逻辑和事务管理。传统J2EE应用通常需要EJB(Enterprise JavaBeans)和...

    springmybatis

    3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 ...

    华为面试试题,很经典,转载

    【Spring】Spring框架是企业级应用开发的基石,面试可能围绕IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)展开,包括Bean管理、依赖注入、事务处理、Spring MVC、Spring Boot、Spring Data JPA...

    Spring-activiti:转载测试通过--被人的SSM和ACTIVITI整合框架

    项目技术架构(Spring+SpringMVC+Mybatis)MavenSpring(IOC DI AOP 声明式事务处理)SpringMVC(支持Restful风格)Hibernate Validator(参数校验)Mybatis(最少配置方案)shiro权限控制,结合ajax实现了异步认证与...

    SSM整合,参考尚硅谷视频,转载笔记,非原创,侵权删

    SSM整合指的是Spring、SpringMVC和MyBatis三个开源框架的集成,是Java后端开发中的常见技术栈。这一体系结构为开发者提供了强大的控制层、服务层和数据访问层的支持,使得企业级应用的开发更为高效和便捷。下面将...

    本项目是基于SpringBoot的线上宠物物资购买系统,为个人毕业设计,未经允许禁止转载.zip

    1. **Spring Framework**: 提供了依赖注入、AOP(面向切面编程)、事务管理等核心功能。 2. **Spring Boot Auto Configuration**: 根据类路径中的jar和存在的bean自动配置应用。 3. **Spring MVC**: 实现了Model-...

    使用open source产品组装你的web应用架构(转载)

    2. PostgreSQL:功能强大且开源的对象关系数据库,支持复杂查询和事务处理,适合需要高级数据库功能的应用。 四、缓存 1. Redis:内存数据结构存储系统,可用作数据库、缓存和消息中间件,提供高速访问性能。 2. ...

    Java 最常见 200+ 面试题全解析:面试必备.pdf

    17. MySQL:作为关系型数据库管理系统,介绍其数据表操作、索引优化、事务处理、备份恢复等知识。 18. Redis:非关系型内存数据库,用于存储键值对数据,涉及数据类型、持久化策略、缓存使用等主题。 19. JVM:...

    JAVA数据库连接大全-转载

    这篇博客"JAVA数据库连接大全-转载"可能详细介绍了在Java中如何管理和使用数据库连接,包括使用JDBC API,数据库连接池以及相关的工具。这里我们将深入探讨JDBC、数据库连接池的重要性和配置方法。 1. **JDBC基础**...

    ssh商城代码

    像hibernate事务,完全鸡肋,而缓存,大部分时候也用不上,需要用到的场景,完全可以自已开发,更轻,而数据关系变得复杂后,hibernate越难驾驭,分布式事务的时候,我没搞过,不知hibernate好不好处理,还是mybatis...

    Java面试题

    10. **数据库操作**:掌握JDBC基本操作,事务处理,以及SQL语句优化。了解ORM框架如Hibernate和MyBatis的工作原理。 11. **Spring框架**:理解依赖注入(DI)和面向切面编程(AOP)的概念,熟悉Spring Boot和Spring...

    Java面试资料大集合

    - **事务处理**:ACID特性,隔离级别及其影响。 - **数据库设计**:范式理论,表关联设计。 10. **算法与数据结构** - **排序算法**:冒泡、选择、插入、快速、归并等,以及时间复杂度分析。 - **查找算法**:...

Global site tag (gtag.js) - Google Analytics