`

spring事务---事务传播属性

阅读更多

手工控制事务

Hibernate的事务操作:

 

public void save(){
	Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
	Info info = new Info("ezbcw");
	info.setContent("ezbcw");
	session.save(info );
	session.getTransaction().commit();
    }

JDBC的事务操作:

 

Connection conn = null;
try {
	.......
	conn.setAutoCommit(false);
	Statement stmt = conn.createStatement();
	stmt.executeUpdate("update person where name='叶天'");
	conn.commit();
	.....
} catch (Exception e) {
	conn.rollback();  
} finally{
	conn.close();
}

 

 

使用Spring, 我们就不再需要手工控制事务

 

public class Bean1 {
      @Transactional(propagation=Propagation.Required)
      public void update(){
            executeUpdate(“update account set amount=? where id=?"); 	
      }
}

 

Spring中Propagation类的事务属性详解:

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 

PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

 PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 

PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

 

ServiceA {   
     /**  
      * 事务属性配置为 PROPAGATION_REQUIRED  
      */  
     void methodA() {   
         ServiceB.methodB();   
     }   
}   
  
ServiceB {        
     /**  
      * 事务属性配置为 PROPAGATION_REQUIRED  
      */    
     void methodB() {   
     }   
}     

 

 

PROPAGATION_REQUIRED 

最常见的选择,默认就是这个

如果当前正要执行的事务不在另外一个事务里,那么就起一个新的事务。

如果当前正要执行的事务已经在另一个事务中,那么就公用另一个事务。

第一个场景

ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候, ServiceA.methodA开启事务,这时调用ServiceB.methodB

ServiceB.methodB看到自己已经运行在ServiceA.methodA的事务内部,就不再起新的事务。

第二个场景

ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。 

这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。

就算ServiceB.methodB已经执行完,但是ServiceA.methodA在接下来抛异常要回滚,ServiceB.methodB也要回滚。

 

PROPAGATION_REQUIRES_NEW 

ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,

ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW, 

那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,他才继续执行。

他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。

因为ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。

如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。

如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。 

 

Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚。 

 

分享到:
评论

相关推荐

    Spring中事务的传播属性详解

    本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### 二、事务传播属性概述 事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,...

    spring事务-项目案例-PPT解读.zip

    spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,每个测试方法都附带日志分析记录、使用场景和实际场景,小白也能看得懂!!! 2.在测试类Test包下,使用juniter...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    2. **spring-context-3.2.0.RELEASE.jar**:上下文模块扩展了`spring-core`,引入了ApplicationContext接口,提供了一种管理和配置bean、事件传播、国际化和资源访问的环境。它还支持AOP(面向切面编程)和JMX(Java...

    spring-framework-1.0-with-dependencies.zip

    2. **spring-context**:扩展了spring-beans,引入了ApplicationContext接口,提供了一种更高级的容器,可以处理国际化、事件传播、资源加载等功能。 3. **spring-aop**:提供了AOP功能,包括定义切入点、通知、...

    spring 事务传播 demo

    本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...

    springframework-4.2.5

    4.2.5版本的改进包括更好的事件传播机制和对JSR-330标准的进一步集成。 4. **Spring Web MVC**:`spring-webmvc-4.2.5.RELEASE.jar`是Spring的Web应用模型-视图-控制器(MVC)框架,它提供了处理HTTP请求、视图解析...

    Spring4--3.jdbcTemplate事务

    - **事务传播行为**:定义了如何在嵌套事务中处理事务边界,如REQUIRED(默认,如果已有事务则加入,没有则新建)、REQUIRES_NEW(始终新建一个事务)等。 在实际应用中,通常会结合使用JdbcTemplate和声明式事务...

    spring-framework-4.3.6.RELEASE-dist.zip

    Context模块提供了更丰富的上下文,支持国际化、事件传播、AOP代理等。SpEL则提供了一个强大的表达式语言,用于在运行时查询和操作对象属性。 2. **Data Access/Integration**:这部分包括JDBC、ORM(Object-...

    Spring事务传播属性

    TransactionDefinition接口是Spring事务管理的核心接口之一,它提供了定义事务特性的方法,包括事务的隔离级别、超时时间、读写模式以及我们关注的事务传播属性。事务传播属性定义了当一个事务方法被另一个事务方法...

    Spring事务传播机制.docx

    Spring 事务传播机制 Spring 事务传播机制是指在 Spring 框架中,事务的传播和嵌套机制。当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套...

    spring2.5 -3.0 hibernate3.3 jar包说明

    提供了Spring的上下文支持,包括对国际化、事件传播、资源加载以及事务管理等特性的支持。它还提供了与JNDI的集成,支持Web应用程序中的环境特性。 5. **spring-dao.jar** 提供了异常层次结构,它使开发者能够以...

    Spring事务传播特性解析

    通过代码解析spring传播特性,包括 1、Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、...

    spring事务的传播特性和事务隔离级别

    Spring提供了七种事务传播特性,每一种都有其特定的场景适用性。 1. **PROPAGATION_REQUIRED** - 这是最常用的传播行为。当使用此传播行为时,如果当前存在事务,则在该事务中执行;如果没有,则创建一个新的事务...

    SPRING事务传播特性&事务隔离级别

    ### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...

    官方原版源码 spring-5.2.8.RELEASE.zip

    深入源码,我们可以研究Spring如何实现依赖注入、AOP代理、事件传播、资源管理等关键机制。例如,`org.springframework.beans.factory.BeanFactory`接口是Spring容器的核心,负责创建和管理Bean。`BeanPostProcessor...

    Spring事务处理-ThreadLocal的使用

    Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中...

    spring 事务传播

    在深入探讨Spring框架中的事务传播属性之前,我们先来简要回顾一下Spring事务的基础概念。Spring框架提供了强大的事务管理功能,允许开发者通过声明式的方式管理业务逻辑中的事务边界。Spring的事务管理主要依赖于`...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    spring-jdbc-4.2.4.RELEASE.jar,spring-tx-4.2.4.RELEASE.jar,jdbcTemplate使用的jar包

    `@Transactional`注解用于标记需要进行事务管理的方法,其包含多个属性,如`propagation`定义事务传播行为,`isolation`定义事务隔离级别,`rollbackFor`指定触发回滚的异常类型等。 `jdbcTemplate`的使用通常涉及...

    spring-framework-3.2.3.RELEASE-dist.zip

    ApplicationContext则在此基础上提供了更多的企业级服务,如国际化、事件传播和资源加载等。 2. **数据访问/集成**:Spring提供了丰富的数据访问接口和工具,包括JDBC抽象层、ORM(Object-Relational Mapping)支持...

Global site tag (gtag.js) - Google Analytics