详谈Spring框架之事务管理

一、编程式事务

二、声明式事务

1、基于XML的事务

1.1 Spring配置文件

 <!-- 配置c3p0数据源,只是进行了最简单的配置 -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="root"></property>
    <property name="password" value="hss325730"></property>
    <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test"></property>
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
  </bean>

  <!-- 配置Spring的 JdbcTemplate -->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 配置Bean -->
  <bean id="bookDao" class="com.zhoujian.spring.transcation.xml.BookDaoImpl">
    <property name="tempate" ref="jdbcTemplate"></property>
  </bean>
  <bean id="bookService" class="com.zhoujian.spring.transcation.xml.service.impl.BookServiceImpl">
    <property name="dao" ref="bookDao"></property>
  </bean>
  <bean id="batchBuy" class="com.zhoujian.spring.transcation.xml.service.impl.BatchBuyImpl">
    <property name="service" ref="bookService"></property>
  </bean>

  <!-- 配置事务管理器 -->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
  </bean>

  <!-- 配置事务管理器属性 并与事务管理器关联-->
  <tx:advice id="myAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <!-- 在这里一般都是使用通配符进行配置, 或者直接配置指定的方法 -->
      <tx:method name="buy" propagation="REQUIRES_NEW"/>
      <tx:method name="get*" propagation="REQUIRED"/>
      <tx:method name="*"/>
    </tx:attributes>
  </tx:advice>

  <!-- 配置开启事务的切入点,使用AOP进行切入点的配置,并与事务管理器属性关联起来 -->
  <aop:config>
    <aop:pointcut expression="execution(* com.zhoujian.spring.transcation.xml.service.*.*(..))" id="myPointcut"/>
    <aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/>
  </aop:config>

1.2 业务类

和下面注解方式使用的类一样,不过是去掉了注解,我将所有的Service层放在一个包下,这样便于AOP 切入点表达式的书写

2、基于注解的事务

2.1、Sprin配置文件

 <!-- 配置自动扫描 -->
  <context:component-scan base-package="com.zhoujian.spring"></context:component-scan>

  <!-- 配置c3p0数据源,只是进行了最简单的配置 -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="root"></property>
    <property name="password" value="hss325730"></property>
    <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test"></property>
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
  </bean>
<!-- 配置Spring的 JdbcTemplate -->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
  </bean>
<!-- 配置事务管理器 -->
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
  </bean>
 <!-- 启动事务注解 -->
  <tx:annotation-driven transaction-manager="transactionManager"/>

2.2、业务类(Spring 在 Service 层上开启事务)

package com.zhoujian.spring.transcation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("bookService")
public class BookServiceImpl implements BookService {

  @Autowired
  private BookDao dao;

  //这里是在指定方法上面开启事务
  @Transactional
  @Override
  public void buy(String userId, String bookId) {

    Integer price = dao.getBookPrice(bookId);

    dao.updateBookCount(bookId);

    dao.updateUserAccount(userId, price);
  }

}

2.3关于事务的属性(事务隔离级别,事务传播行为,事务异常控制,事务强制回滚时间控制,事务是否只读)

一般情况下,不需要进行手动改变事务属性,使用默认的就行

package com.zhoujian.spring.transcation;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service("batchBuy")
public class BatchBuyImpl implements BatchBuy {
  @Autowired
  private BookService service;

  /**
   * 1、关于事务的传播行为(当前事务方法调用另外的事务方法时,面对的事务怎么使用的问题),
   * 常用的有两种(Propagation.REQUIRED, Propagation.REQUIRES_NEW)
   * Spring 默认使用 Propagation.REQUIRED,表示使用当前事务方法持有的事务
   *
   * 例如: 事务方法A 调用事务方法B,
   * 如果事务的传播行为使用Propagation.REQUIRED时,表示支持已经存在的事务,
   * 如果在调用A方法之前不存在任何事务,那么此时会创建一个新的事务,在这里则都使用方法A所持有的事务,
   *  对于该配置,如果B过程中发生异常需要回滚,那么A中所进行的所有数据库操作也将同时被回滚,
   * 因为这两个方法使用了同一个事务;
   *
   *
   * 如果事务的传播行为使用Propagation.REQUIRES_NEW时, 表示将A方法所持有的事务挂起,
   * 使用B方法自己的事务,当B方法事务完成之后,A事务才被唤醒
   */
  @Transactional(propagation=Propagation.REQUIRED)
  @Override
  public void buy(String userId, List<String> bookIds) {
    for(String bookId : bookIds){
      service.buy(userId, bookId);
    }
  }
}

3、测试类

package com.zhoujian.spring.transcation;
import java.util.Arrays;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TranscationTest {
  private static ApplicationContext ac = null;
  private static BookDao dao = null;
  private static BookService service;
  private static BatchBuy buy;

  static{
    ac = new ClassPathXmlApplicationContext("bean-transcation.xml");
    dao = ac.getBean("bookDao", BookDao.class);
    service = ac.getBean("bookService", BookService.class);
    buy = ac.getBean("batchBuy", BatchBuy.class);
  }

  @Test
  public void test1(){
    buy.buy("001", Arrays.asList("1","2"));
  }

  @Test
  public void test() {
    service.buy("001", "1");
  }
}

以上这篇详谈Spring框架之事务管理就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Java的Spring框架中的事务管理方式

    数据库事务是被当作单个工作单元的操作序列.这些操作要么全部完成或全部不成功.事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS中的重要组成部分.事务的概念可以用下面的描述为ACID四个关键属性来描述: 原子性: 一个事务应该被视为单个操作单元表示的操作的任一整个序列是成功的或不成功的. 一致性: 这代表了数据库的参照完整性,在桌等唯一主键的一致性 隔离性: 可能有很多事务处理相同的数据集的同时,每个事务都应由他人隔离,以防止数据损坏. 持久性: 一旦事务完成,本次事务的结果必须作出

  • 详解Spring学习之编程式事务管理

    前言 在前面的内容,基本已经学习了事务的基本概念以及事务隔离级别等,接下来的几个小节,将学习怎么使用Spring进行事务管理,在Spring中,对事务进行管理有多种方法,主要分别编程式和声明式,本小节主要学习编程式事务管理,后面讲学习Spring的声明式事务管理 编程式事务管理 所谓的编程式事务管理,其实就是通过编写代码的方式来进行事务管理,也就是通过将事务管理的代码硬编码在代码中从而达到事务管理的作用,不过Spring的事务管理不同于JDBC原始的事务管理,在JDBC中,对事务进行管理首先要关

  • 详谈Spring框架之事务管理

    一.编程式事务 二.声明式事务 1.基于XML的事务 1.1 Spring配置文件 <!-- 配置c3p0数据源,只是进行了最简单的配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="root"></property>

  • Spring中的事务管理实例详解

    本文实例讲述了Spring中的事务管理.分享给大家供大家参考.具体分析如下: 事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性(ACID) ① 原子性(atomicity):事务室一个原子操作,有一系列动作组成.事务的原子性确保动作要么全部完成,要么完全不起作用 ② 一致性(consistency):一旦所有事务动作完成,事务就被提交.数据和资源就

  • Spring详细解读事务管理

    目录 什么是事务 Spring事务配置 Spring事务传播行为 1. PROPAGATION_REQUIRED 2. PROPAGATION_SUPPORTS 3. PROPAGATION_REQUIRES_NEW 声明式事务失效 什么是事务 事务就是对数据库若干操作组成的一个单元 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合.由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数

  • Spring+SpringMVC配置事务管理无效原因及解决办法详解

    一般我们在Spring的配置文件application.xml中对Service层代码配置事务管理,可以对Service的方法进行AOP增强或事务处理如事务回滚,但是遇到一个问题,在Controller类中调用Service层方法,配置的事务管理会失效,查询相关资料发现原因.其实Spring和SpringMVC俩个容器为父子关系,Spring为父容器,而SpringMVC为子容器.也就是说application.xml中应该负责扫描除@Controller的注解如@Service,而Spring

  • Spring中的事务管理如何配置

    这篇文章主要介绍了spring中的事务管理如何配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在springboot中,使用事务非常的简单,因为springboot已经帮我们配置好了,只需要加上注解@Transactional即可 在spring中我们需要做一些配置:主要有三点: @Transactional:在相应的方法上加上这个注解 @EnableTransactionManagement:在配置类中加上,开启事务管理 需要在配置类中加

  • spring声明式事务管理解析

    前沿:通过对spring事务管理有了比较深入学习,本文将不做实例,而是指定具体的类和配置文件进行讲解. 本文内容: 1.了解什么是声明式事务? 2.声明式事务管理分别有哪几种? 3.这几种事务管理之间的区别是什么? 一.什么是声明式事务? 声明式事务(declarative transaction management)是spring提供的对程序事务管理的方式之一.Spring的声明式事务就是采用声明的方式来处理事务,用在Spring配置文件中声明式的处理事务来代替代码式的处理事务.这样的好处是

  • 详解Spring框架入门

    一.什么是Spring Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益.Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. ◆目的:解决企业应用开发的复杂性 ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 ◆范围:任何Java应用 二.

  • 深入解析Java的Spring框架中的混合事务与bean的区分

    混合事务 在ORM框架的事务管理器的事务内,使用JdbcTemplate执行SQL是不会纳入事务管理的. 下面进行源码分析,看为什么必须要在DataSourceTransactionManager的事务内使用JdbcTemplate. 1.开启事务 DataSourceTransactionManager protected void doBegin(Object transaction,TransactionDefinition definition) { DataSourceTransact

  • Spring中事务管理的四种方法(银行转账为例)

    前言 本文配套示例代码下载地址(完整可运行,含sql文件,下载后请修改数据库配置):点击这里下载 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致性:指事务前后数据的完整性必须保持一致. 隔离性:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离. 持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即时数据库发生故障也不应

  • Spring的事务管理你了解吗

    目录 1.事务介绍 2.事务的四个特性(ACID) 3.Spring 事务管理的核心接口 4.PlatformTransactionManager 事务管理器 5.TransactionStatus 事务状态 6.TransactionDefinition 基本事务属性的定义 一.传播行为: 二.隔离级别: 三.只读 四.事务超时 五.回滚规则 7.Spring 编程式事务和声明式事务的区别 8.不用事务实现转账 第一步:创建Java工程并导入相应的 jar 包 第二步:编写 Dao 层 第三步

随机推荐