@Transactional的声明式事务管理
基于<tx>命名空间和基于@Transactional的事务声明方式各有优缺点。基于<tx>的方式,其优点是与切点表达式集合,功能强大。利用切点表达式,一个配置可以匹配多个方法,而基于@Transactional的方式必须在每一个需要使用事务的方法或者类上用@Transactional标注,尽管可能大多数事务的规则是一致的,但是对@Transactional而言它无法重用,必须逐个指定。基于@Transactional的方式使用起来非常简单明了,没有学习成本。
@Transactional可以作用于接口,接口方法,类以及类方法上。当作用于类上时,该类的所有public方法将都具有该类型的事务属性,但是Spring小组建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理是它才会生效。这是Spring AOP的本质决定的,如果在protected,private或者默认可见性的方法上使用@Transactional注解,这将被忽略,也不会抛出任何异常。同时,也可以在方法级别使用该标注来覆盖类级别的定义。
// 业务方法需要在一个事物中运行,如果方法运行时,已经存在一个事物中,
// 那么加入该事物,否则为自己创建一个新事物。
@Transactional(propagation = Propagation.REQUIRED)
public void test1() {
}
// 声明方法不需要事务,如果方法没有关联到一个事务,容器不会为它开启事物。
// 如果方法在一个事物中被调用,该事物会被挂起,在方法调用结束后,原先的
// 事物便会恢复执行。
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void test2() {
}
// 表明不管是否存在事物,业务方法总会为自己发起一个新事物。
// 如果方法已经运行在一个事物中,则原有事物会被挂起,
// 新的事物会被创建,直到方法执行结束,新事物才算结束,
// 原先的事务才会被恢复执行。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test3() {
}
// 该属性指定业务方法只能在一个已经存在的事物中执行,
// 业务方法不能发起自己的事物,如果业务方法在没有事物的环境
// 下调用,容器就会抛出异常。
@Transactional(propagation = Propagation.MANDATORY)
public void test4() {
}
// 这个事物属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事物的一部分,
// 如果业务方法在事务范围外被调用,则方法在没有事物的环境下执行。
@Transactional(propagation = Propagation.SUPPORTS)
public void test5() {
}
// 指定业务方法绝对不能在事物范围内执行。如果业务方法在某个事物中执行,
// 容器会抛出异常,只有业务方法没有关联到任何事物,才能正常执行。
@Transactional(propagation = Propagation.NEVER)
public void test6() {
}
// 如果一个活动的事物存在,则运行在一个嵌套的事物中,如果没有活动事物,
// 则按REQUIRED属性执行,它使用了一个单独的事物,这个事物拥有多个回滚的保存点,
// 内部事务的回滚不会对外事物造成影响,它只对DataSourceTransactionManager
// 事务管理器起效。
@Transactional(propagation = Propagation.NESTED)
public void test7() {
}
@Transactional(isolation = Isolation.DEFAULT)
public void test8() {
}
// 读已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.READ_COMMITTED)
public void test9() {
}
// 读未提交数据(会出现脏读、不可重复读和幻读)
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
public void test10() {
}
// 可重复读(会出现幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void test11() {
}
// 串行化
@Transactional(isolation = Isolation.SERIALIZABLE)
public void test12() {
}
// 抛出Exception异常时,记录回滚
@Transactional(rollbackFor = Exception.class)
public void test13() throws Exception {
}
// 抛出Exception异常时,记录不回滚
@Transactional(noRollbackFor = Exception.class)
public void test14() throws Exception {
}
分享到:
相关推荐
- `propagation`: 事务传播行为,例如`Propagation.REQUIRED`(默认值)表示如果当前没有事务,则新建一个;`Propagation.SUPPORTS`表示如果存在事务则加入,否则不开启事务。 - `isolation`: 事务隔离级别,例如`...
本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...
2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...
在本篇Spring学习笔记中,我们将探讨如何使用Spring框架的注解方式来管理事务,这是一种在现代Java应用中广泛采用的方法。Spring框架以其强大的依赖注入和面向切面编程能力,为事务管理提供了简洁且高效的解决方案。...
Spring支持两种类型的事务管理方式:编程式事务管理和声明式事务管理。 #### 二、编程式事务管理 编程式事务管理允许开发人员通过编程的方式直接控制事务的开始、提交或回滚。这种方式相对灵活,但也存在一些缺点...
注解中可以包含多个属性,如`value`(指定事务管理器)、`propagation`(事务传播行为)、`isolation`(事务隔离级别)、`readOnly`(是否只读事务)等,以定制事务的行为。 3. **事务传播行为** 事务传播行为定义...
#### 2.2 事务传播行为 - REQUIRED:默认行为,如果当前存在事务,则加入该事务;若无,则创建一个新的事务。 - SUPPORTS:如果存在事务,则支持当前事务;若无,事务也可以运行。 - MANDATORY:如果存在事务,则...
Spring 中的事务管理提供了多种传播行为,包括: * PROPAGATION_REQUIRED:如果存在事务,则加入该事务,否则创建一个新的事务 * PROPAGATION_REQUIRES_NEW:总是创建一个新的事务 * PROPAGATION_SUPPORTS:如果...
在Spring框架中,声明式事务管理是其核心特性之一,它允许开发者无需手动处理事务的开始、提交、回滚等操作,而是通过配置或者注解的方式进行声明,从而简化了事务管理的复杂性。本篇文章将深入探讨如何使用Spring的...
总结一下,Spring事务管理提供了XML配置和注解两种方式,使得开发者能够灵活地控制事务的边界和行为。XML方式适合于传统应用,而注解方式则更加简洁,易于理解和维护。无论选择哪种方式,Spring事务管理都能帮助我们...
它支持多种事务传播行为(如 PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW 等),可以根据不同的业务场景灵活配置事务的范围。此外,Spring 还提供了事务回滚规则,允许基于异常类型或异常实例来决定是否回滚...
本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...
Spring 事务传播机制 Spring 事务传播机制是指在 Spring 框架中,事务的传播和嵌套机制。当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套...
本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...
在Java应用中,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理** 是通过调用`PlatformTransactionManager`接口提供的方法来手动控制事务的开始、提交、回滚。例如,你...
这段代码配置了一个事务管理器,并定义了一个事务顾问(`tx:advice`),该顾问指定了不同方法名前缀对应的不同事务传播行为。例如,所有以`save`开头的方法都将使用`REQUIRED`传播行为,这意味着如果当前存在事务,...
Spring通过`@Transactional`注解可以方便地设置事务传播行为和隔离级别,例如: ```java @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED) public void ...
Spring提供了七种事务传播行为: - `PROPAGATION_REQUIRED`:如果存在事务,则加入;否则新建。 - `PROPAGATION_REQUIRES_NEW`:始终新建事务,如果已有事务则挂起。 - `PROPAGATION_SUPPORTS`:如果存在事务,...
- Spring定义了7种事务传播行为,如PROPAGATION_REQUIRED(默认,如果已有事务则加入,否则新建)、PROPAGATION_REQUIRES_NEW(总是新建事务,即使在已有事务中也如此)等,它们决定了方法调用时事务的处理方式。...
Spring定义了七种事务传播行为: 1. REQUIRED:默认设置,如果当前存在事务,则加入该事务;如果没有,则创建一个新的事务。 2. SUPPORTS:如果当前存在事务,则加入该事务;如果没有,也不会创建新的事务。 3. ...