手工控制事务
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中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### 二、事务传播属性概述 事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,...
spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,每个测试方法都附带日志分析记录、使用场景和实际场景,小白也能看得懂!!! 2.在测试类Test包下,使用juniter...
2. **spring-context-3.2.0.RELEASE.jar**:上下文模块扩展了`spring-core`,引入了ApplicationContext接口,提供了一种管理和配置bean、事件传播、国际化和资源访问的环境。它还支持AOP(面向切面编程)和JMX(Java...
2. **spring-context**:扩展了spring-beans,引入了ApplicationContext接口,提供了一种更高级的容器,可以处理国际化、事件传播、资源加载等功能。 3. **spring-aop**:提供了AOP功能,包括定义切入点、通知、...
本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...
4.2.5版本的改进包括更好的事件传播机制和对JSR-330标准的进一步集成。 4. **Spring Web MVC**:`spring-webmvc-4.2.5.RELEASE.jar`是Spring的Web应用模型-视图-控制器(MVC)框架,它提供了处理HTTP请求、视图解析...
- **事务传播行为**:定义了如何在嵌套事务中处理事务边界,如REQUIRED(默认,如果已有事务则加入,没有则新建)、REQUIRES_NEW(始终新建一个事务)等。 在实际应用中,通常会结合使用JdbcTemplate和声明式事务...
Context模块提供了更丰富的上下文,支持国际化、事件传播、AOP代理等。SpEL则提供了一个强大的表达式语言,用于在运行时查询和操作对象属性。 2. **Data Access/Integration**:这部分包括JDBC、ORM(Object-...
TransactionDefinition接口是Spring事务管理的核心接口之一,它提供了定义事务特性的方法,包括事务的隔离级别、超时时间、读写模式以及我们关注的事务传播属性。事务传播属性定义了当一个事务方法被另一个事务方法...
Spring 事务传播机制 Spring 事务传播机制是指在 Spring 框架中,事务的传播和嵌套机制。当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套...
提供了Spring的上下文支持,包括对国际化、事件传播、资源加载以及事务管理等特性的支持。它还提供了与JNDI的集成,支持Web应用程序中的环境特性。 5. **spring-dao.jar** 提供了异常层次结构,它使开发者能够以...
通过代码解析spring传播特性,包括 1、Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、...
Spring提供了七种事务传播特性,每一种都有其特定的场景适用性。 1. **PROPAGATION_REQUIRED** - 这是最常用的传播行为。当使用此传播行为时,如果当前存在事务,则在该事务中执行;如果没有,则创建一个新的事务...
深入源码,我们可以研究Spring如何实现依赖注入、AOP代理、事件传播、资源管理等关键机制。例如,`org.springframework.beans.factory.BeanFactory`接口是Spring容器的核心,负责创建和管理Bean。`BeanPostProcessor...
### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...
Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中...
在深入探讨Spring框架中的事务传播属性之前,我们先来简要回顾一下Spring事务的基础概念。Spring框架提供了强大的事务管理功能,允许开发者通过声明式的方式管理业务逻辑中的事务边界。Spring的事务管理主要依赖于`...
Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...
`@Transactional`注解用于标记需要进行事务管理的方法,其包含多个属性,如`propagation`定义事务传播行为,`isolation`定义事务隔离级别,`rollbackFor`指定触发回滚的异常类型等。 `jdbcTemplate`的使用通常涉及...
Spring提供了Spring事务管理API,其中的核心是PlatformTransactionManager接口,它为不同的持久化技术提供了相应的实现类,比如DataSourceTransactionManager用于JDBC事务,HibernateTransactionManager用于...