在Spring的事务管理中,我们可以使用@Transactional这一annotation来对事务进行声明式的设定。具体而言,就是在类或者方法前添加@Transactional并传入属性参数以获取所需要的Transaction特性。Spring中的@Transactional有5个属性:Propagation、Isolation、Rollback Rules、Timeout和Read-Only,其中Propagation属性定义了Transaction的边界 — 是否使用Transaction、在Transaction已存在的情况下如何表现等。
Propagation属性
@Transactional中Propagation属性有7个选项可供选择:
Propagation.MANDATORY 。当前方法必须在已经定义的Transaction中运行,如果没有已定义的Transaction则抛出异常。
Propagation.NESTED 。如果没有已定义的Transaction,当前方法新开一个Transaction并在该Transaction中运行。如果存在已定义的Transaction,当前方法在嵌套事务(Nested Transaction)中运行 — 嵌套事务中可以定义储存点,因此可以独立于外部的Transaction而进行rollback。
Propagation.NEVER 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction则抛出异常。
Propagation.NOT_SUPPORTED 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction,则该Transaction暂停(挂起)直至该方法运行完毕。
Propagation.REQUIRED 。 默认值 。当前方法必须在Transaction中运行。如果存在已经定义的Transaction,则该方法在已定义的Transaction中运行;如果不存在已经定义的Transaction,则该方法新开一个Transaction并在其中运行。
Propagation.REQUIRES_NEW 。当前方法必须在新开的Transaction中运行。如果存在已经定义的Transaction,则该已定义的Transaction暂停直至新开的Transaction执行完毕。
Propagation.SUPPORTS 。当前方法不需要在Transaction中运行,但如果存在已经定义的Transaction,则该方法也可以在Transaction中正常执行。
Propagation属性实例
观察以下两个定义了@Transactional的方法,innerMethod()模拟了Transaction已经存在的情况,outMethod()则模拟了不存在已定义Transaction的情况:
@Transactional
public void outMethod() {
exampleDAO.doSomething();
innerMethod();
}
@Transactional
public void innerMethod() {
exampleDAO.doElse();
}
对于这两个方法,定义不同的Propagation属性值所产生的效果如下(Propagation.NESTED的情况较为复杂,在此忽略):
Propagation属性 outMethod innerMethod
Propagation.MANDATORY .抛出异常 .在outMethod的Transaction中运行
Propagation.NEVER .不在Transaction中运行 .抛出异常
Propagation.NOT_SUPPORTED .不在Transaction中运行 .outMethod的Transaction暂停直至innerMethod执行完毕
Propagation.REQUIRED ( 默认值 ) .新开一个Transaction并在其中运行 .在outMethod的Transaction中运行
Propagation.REQUIRES_NEW .新开一个Transaction并在其中运行 .outMethod的Transaction暂停直至innerMethod中新开的Transaction执行完毕
Propagation.SUPPORTS .不在Transaction中运行 .在outMethod的Transaction中运行
分享到:
相关推荐
此外,可以通过Spring的`@Transactional`注解的属性(如`propagation`、`isolation`等)来定制事务的行为,以适应不同的业务场景。 总结来说,`@Transactional`是Spring提供的一种强大的工具,它简化了事务管理,...
在Spring框架中,`@Transactional`注解是一个强大的工具,用于声明式地管理事务。它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@...
- `@Transactional`注解仅在Spring AOP代理能够拦截到的方法上生效,因此,如果在非Spring管理的类或静态方法中使用,事务管理将不起作用。 - 如果事务属性设置不当,可能会导致数据不一致或并发问题,应谨慎调整...
`@Transactional`注解允许指定这些属性,如`propagation`(传播行为)、`isolation`(隔离级别)、`readOnly`(只读事务)等。 总的来说,Spring的`@Transactional`注解为开发者提供了方便且强大的声明式事务管理...
在 Spring 框架中,@Transactional 注解是实现声明式事务的关键。通过 @Transactional 注解,可以指定事务的传播行为、隔离级别、读写控制等属性。 首先,@Transactional 注解支持 9 个属性的设置,常用的三个属性...
3. 只读事务:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) 只读标志只在事务启动时应用,否则即使配置也会被忽略。 二、事务传播模式 在 @Transactional 注解中,Propagation 枚举了...
5. ** propagation 设置不当**:`@Transactional`的propagation属性决定了事务如何在方法间传播。如果不理解其含义,可能会导致事务无法正常开始或结束。 6. **isolation 设置问题**:隔离级别设置不正确可能导致脏...
`@Transactional`可以设置不同的属性,如`propagation`(传播行为)、`isolation`(隔离级别)、`rollbackFor`(触发回滚的异常类型)等。下面是一个声明式事务的例子: ```java @Service public class UserService...
注解中可以指定事务属性,如`propagation`(事务传播行为)、`isolation`(隔离级别)、`rollbackFor`(触发回滚的异常类型)等。 - **默认属性**:如果不指定,通常默认的传播行为是`PROPAGATION_REQUIRED`,意味...
使用 try…catch…语句块捕获,而 catch 语句块没有throw new RuntimeExecption 异常、注解@Transactional 中 Propagation 属性值设置错误、mysql 关系型数据库,且存储引擎是 MyISAM 而非 InnoDB。了解这些常见场景...
在Spring框架中,事务管理是其核心特性之一,它使得开发者能够在应用程序中实现数据库操作的事务一致性。事务传播行为是指在一个事务方法被另一个事务方法调用时,如何处理这两个方法之间的事务关系。Spring定义了七...
在上面的代码中,我们添加了 @Transactional 注解,该注解指定了事务的传播行为(Propagation.SUPPORTS)和 readOnly 属性。这样,在查询操作中,Hibernate Session 将被正确地绑定到当前线程。 而在插入、修改和...
例如:@Transactional(noRollbackFor = { ClassCastException.class, IndexOutOfBoundsException.class}) 结语 本资源总结了基于Spring JDBC的事务管理,包括事务的定义、使用 @Transactional 注解、Spring JDBC的...
Spring中的@Transactional注解是Spring框架提供的一个核心特性,它用于声明式事务管理,使得开发者可以在不直接接触事务API的情况下,实现事务的控制。这个注解可以用在类或方法级别,来指定事务的传播行为、隔离...
* propagation:指定事务的传播行为,默认值为REQUIRES_NEW。 * isolation:指定事务的隔离度,默认值采用DEFAULT。 * timeout:指定事务的超时时间,默认值为-1。 * readOnly:指定事务是否为只读事务,默认值为...
在深入探讨Spring框架中的事务传播属性之前,我们先来简要回顾一下Spring事务的基础概念。Spring框架提供了强大的事务管理功能,允许开发者通过声明式的方式管理业务逻辑中的事务边界。Spring的事务管理主要依赖于`...
2. `@Transactional(propagation = Propagation.REQUIRED)`:默认情况下,如果当前没有事务,Spring会新建一个;如果有事务,则加入到当前事务中。其他传播行为包括SUPPORTS(如果已有事务就支持,没有则不开启)、...
### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...
@Transactional注解中的propagation属性决定了事务如何在方法调用链中传播。如果不正确地设置,可能会影响事务的行为。例如,如果设置为REQUIRES_NEW,即使在调用链中有其他@Transactional方法,也会为每个方法启动...
Spring 配置文件中定义一个事务管理对象(如 DataSourceTransactionManager),然后加入 `<tx:annotation-driven/>` 节点,引用该事务管理对象,然后即可在需要进行事务处理的类和方法使用 `@Transactional` 进行...