spring提供俩种事务管理方式
1.annotation(注解)
2.xml配置(aop技术)
本文介绍下第一种,annotation注解的方式
一、首先,在spring的配置文件中,配置如下配置:
在配置文件中,配置事务管理对象,比如org.springframework.orm.hibernate4.HibernateTransactionManager,或者org.springframework.orm.jpa.JpaTransactionManager,或者org.springframework.jdbc.datasource.DataSourceTransactionManager等等(当然,这三种事务管理对象的使用场景和功能不是完全一致的)。
然后加入<tx:annotation-driven/>节点,引用该事务管理对象,之后即可在需要进行事务处理的类和方法使用@Transactional进行标注。
之于事务对象的属性配置,<property>,可以配置SessionFactory,可以配置dataSource等,截图中配置了SessionFactory。
针对<tx:annotation-driven/>的说明:
配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx、mvc 等也能很直白的理解出来分别的作用。<tx:annotation-driven/> 就是支持事务注解的(@Transactional) 、<mvc:annotation-driven> 就是支持mvc注解的,说白了就是使Controller中可以使用MVC的各种注解。
首先,<tx:annotation-driven/> 会有一个属性来指定使用哪个事务管理器,如:<tx:annotation-driven transaction-manager="transactionManager" />。然后事务管理器 transactionManager 会引用 dataSource (如果我们使用JPA或Hibernate,也需要指定一个 entityManagerFactory ),dataSouce 肯定就是直接对数据库的了。
二、配置完成之后,在使用事务管理的类或者方法上使用@Transactional进行注解即可,一般需要更新数据库,保存数据库等操作的类或者方法需要进行事务注解。
如下图所示:
三、对于注解,可以设置事务属性,比如:
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
根据定义,Transactional注解可以有如下的属性定义:
Propagation。主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系。
- 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中正常执行。
-
三、@Transactional标注的位置
@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承,可能会出现不启动事务的情况。所以,Spring建议我们将@Transaction注解在实现类上。
在方法上的@Transactional注解会覆盖掉类上的@Transactional。
相关推荐
Spring3引入了基于注解的事务管理,极大地简化了事务配置,使得开发者可以在方法级别声明事务边界,这就是`@Transactional`注解的用处。本文将深入探讨这个注解以及如何在Spring3中有效地使用它。 `@Transactional`...
SpringBoot 中事务管理 @Transactional 的注意事项与使用场景 在本篇文章中,我们将详细讲解 SpringBoot 中事务管理 @Transactional 的注意事项与使用场景,以帮助开发者更好地理解和使用 @Transactional 注解。 ...
为了使用基于@Transactional的事务管理,需要在Spring中进行配置。下面是一个简单的示例: 首先,需要在Spring的配置文件中添加tx名字空间: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
相较于编程式事务管理,声明式事务管理更易于维护,因为事务管理的逻辑被声明在配置或元数据中,而不是散落在业务代码中。本篇文章将深入探讨如何使用注解进行Spring中的事务管理。 首先,我们需要了解Spring中的...
在Spring框架中,`@Transactional`注解是事务管理的核心组件,它允许开发者在方法级别声明事务边界。本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是...
本文将重点介绍基于`@Transactional`注解的声明式事务管理。 声明式事务管理是Spring框架的一大特色,它通过AOP(面向切面编程)实现,使得开发者无需在业务逻辑代码中处理事务控制,而是通过配置或注解来定义事务...
我们也可以使用基于 XML 的事务管理来解决这个问题。在 Spring Boot 应用程序中,我们可以使用 XML 配置文件来管理事务。 ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=...
Spring 3.0 提供了两种事务管理配置方法:基于 XML 的事务管理和基于 @Transactional 的事务管理,这两种方法都是为了实现事务管理的目标,分别具有不同的配置方式和优缺点。 基于 XML 的事务管理 这种方法不需要...
声明式事务管理是Spring提供的主要事务管理方式,它基于AOP(面向切面编程)。这种方式允许在方法调用前开始事务,方法执行完成后根据执行结果决定提交或回滚事务。具体实现有两种形式: - **基于XML的配置**:...
本资源主要介绍基于Spring JDBC的事务管理,包括事务的定义、使用 @Transactional 注解、Spring JDBC的事务管理机制、事务的ACID特性、事务的传播、事务的隔离等内容。 事务的定义 事务是一种数据库中能够保证一...
声明式事务管理通过在方法上添加@Transactional注解来实现,这使得开发者无需编写事务管理代码就能控制事务。编程式事务管理则需要通过TransactionTemplate或者PlatformTransactionManager接口手动管理事务的开始、...
在Spring框架中,提供了多种事务管理方式,其中之一就是基于AspectJ的事务控制。本文将深入探讨如何在Spring中利用AspectJ实现事务控制。 首先,我们需要理解什么是AspectJ。AspectJ是一种面向切面编程(AOP)的...
本篇文章将重点关注声明式事务管理中的注解驱动方式,也就是基于`@Transactional`注解的事务实现。这种方式使得代码更加简洁,降低了事务管理的复杂性。 1. **什么是声明式事务管理** 声明式事务管理允许开发者在...
Spring提供了多种事务管理方式,其中基于注解的事务管理是近年来常用的模式,因为它简化了代码并提高了可读性。本文将深入探讨Spring中的基于注解的事务管理及其工作原理。 ### 1. Spring事务管理概述 Spring事务...
1. **基于@Transactional注解的事务管理** `@Transactional` 是Spring提供的一个注解,用于标记在哪些方法或类上需要开启事务。当我们在业务实现类如`AccountServiceImpl`的方法上添加这个注解时,Spring会自动在该...
基于注解的声明式事务管理则是利用@Transactional注解在方法上声明事务属性。例如: ```java @Service public class UserService { @Transactional(propagation = Propagation.REQUIRED) public void updateUser...
在这个例子中,我们将聚焦于Spring的声明式事务管理,特别是通过`TransactionProxyFactoryBean`代理机制以及`@Transactional`注解与AOP(面向切面编程)的结合使用。 首先,`TransactionProxyFactoryBean`是Spring...
@Transactional注解是声明式事务管理的核心,它可以直接应用于类或者方法上,用来声明一个方法需要在事务上下文中执行。当该注解应用于类时,类中的所有public方法都将默认在事务中运行;如果只应用于特定方法,则...
要使用声明式事务,需要先搭建环境,包括导入相关依赖、配置数据源和 JdbcTemplate、给方法上标注 @Transactional、开启基于注解的事务管理功能、配置事务管理器等步骤。 1. 导入相关依赖:需要导入 Spring-jdbc ...
本篇内容主要涉及两种声明式事务管理方式:基于XML和基于Annotation。 1. **基于XML的声明式事务管理** 这种方式是通过在Spring的配置文件中使用`<tx:advice>`元素来定义事务规则。`<tx:advice>`是事务增强处理的...