小呆呆的生活

  • 首页
  • 分类
    • Linux
    • MySQL
    • SpringBoot
    • SpringCloud
  • 工具
  • 留言
  • 登录
  • 注册
  • 友情链接
    • 咸鱼的窝
    • DIY熙的家
    • Farmer的自习室
    • Dark的小黑屋
  • 关于
人的一生注定会遇到两个人
一个惊艳了时光,一个温柔了岁月
  1. 首页
  2. Spring
  3. 正文

Spring事务的使用示例和传播行为以及失效场景

2023年 12月 10日 685次阅读 0人点赞 0条评论

前言

  我们都知道事务提供了一种机制,用于管理和保护数据库操作或其他资源访问的一系列操作。通过使用事务,可以确保数据的一致性、完整性和正确性,提高系统的可靠性和可维护性。那么在Spring中事务是如何使用呢?又会有什么问题呢?


一、Spring事务是什么

  Spring事务是Spring框架提供的一种机制,用于管理数据库操作或其他资源访问的一系列操作,以确保这些操作要么全部成功提交,要么全部回滚,从而保持数据的一致性和完整性。
  使用Spring事务可以将一组相关的数据库操作组织在一个事务中,以便在出现错误或异常时进行回滚,保证数据的一致性。Spring事务提供了声明式事务和编程式事务两种方式来管理事务。


二、简单示例

  1. 配置数据源和事务管理器:首先,需要在Spring配置文件中配置数据源和事务管理器。数据源用于连接数据库,事务管理器用于管理事务。例如,可以使用Spring的DataSource和DataSourceTransactionManager来配置数据源和事务管理器。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- 数据源配置 -->
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
  1. 配置事务通知:接下来,需要配置事务通知,以便在方法执行前后进行事务管理。可以使用<tx:advice>元素和<aop:config>元素来配置事务通知。在事务通知中,可以指定事务的传播行为、回滚规则等。
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))" />
    <aop:advisor advice-ref="transactionAdvice" pointcut-ref="serviceMethods" />
</aop:config>
  1. 使用事务:在需要进行事务管理的方法上添加@Transactional注解,以指示该方法需要在事务中执行。可以在类级别或方法级别添加注解,具体取决于需要进行事务管理的粒度。
@Transactional
public class UserServiceImpl implements UserService {
    // 方法实现
}

通过以上配置和注解,Spring将会在执行被@Transactional注解修饰的方法时,自动创建和管理事务。如果方法执行成功,事务将会提交;如果方法抛出异常或返回一个错误结果,事务将会回滚。

需要注意的是,为了使事务生效,需要确保Spring容器能够扫描到带有@Transactional注解的类,并且配置了合适的AOP配置。

这是一个简单的Spring事务的使用示例。通过使用Spring事务,可以简化事务管理的代码,并提供了一种声明式的方式来管理事务,提高了代码的可维护性和可读性。


三、Spring事务的传播行为

  Spring事务的传播行为(Transaction Propagation Behavior)定义了一个方法在存在事务的情况下如何参与到当前事务中,或者在没有事务的情况下如何创建一个新的事务。Spring框架提供了多种事务传播行为选项,可以根据不同的需求选择适当的传播行为。

1. 以下是几种常见的事务传播行为:

  1. REQUIRED(默认行为):如果当前存在事务,则方法在该事务中运行;如果没有事务,则创建一个新的事务。这是最常用的传播行为,适合大多数情况。

  2. REQUIRES_NEW:无论当前是否存在事务,方法都会创建一个新的事务。如果当前存在事务,则将其挂起。这个传播行为适用于需要独立事务的情况,例如在方法中执行一个独立的子任务。

  3. SUPPORTS:如果当前存在事务,则方法在该事务中运行;如果没有事务,则方法在非事务状态下运行。这个传播行为适用于既可以在事务中运行,也可以在非事务状态下运行的方法。

  4. NOT_SUPPORTED:方法在非事务状态下运行,如果当前存在事务,则将其挂起。这个传播行为适用于明确不需要事务支持的方法。

  5. MANDATORY:方法在当前事务中运行,如果当前没有事务,则抛出异常。这个传播行为适用于必须在事务中运行的方法,如果没有事务,则认为是一个错误的状态。

  6. NEVER:方法在非事务状态下运行,如果当前存在事务,则抛出异常。这个传播行为适用于必须在非事务状态下运行的方法,如果存在事务,则认为是一个错误的状态。

  7. NESTED:如果当前存在事务,则在一个嵌套事务中运行;如果没有事务,则创建一个新的事务。嵌套事务是外部事务的一部分,具有独立的保存点,可以回滚到嵌套事务的开始点。如果外部事务回滚,嵌套事务也会回滚。这个传播行为适用于需要在方法内部创建一个嵌套事务的情况。

2. 实现方式

  可以使用@Transactional注解或编程方式来指定方法的事务传播行为。例如,在使用@Transactional注解时,可以使用propagation属性来指定传播行为,例如:@Transactional(propagation = Propagation.REQUIRED)。

选择适当的事务传播行为非常重要,以确保事务的一致性和正确性。根据具体的业务需求和方法之间的关系,选择合适的传播行为可以确保事务的正确运行和预期行为。


四、Spring事务失效的场景

以下是几个常见的导致Spring事务失效的场景:

  1. 未使用@Transactional注解:在使用Spring事务管理时,需要在需要事务支持的方法上添加@Transactional注解,以指示该方法需要在事务中执行。如果忘记添加@Transactional注解,那么该方法将不会受到Spring事务管理的影响,事务将失效。

  2. 异常未被捕获:Spring事务默认只在遇到未捕获的RuntimeException时回滚事务。如果在事务中抛出的异常被捕获并处理,那么事务将不会回滚。如果希望在遇到特定的受检异常时也回滚事务,可以使用@Transactional注解的rollbackFor属性来指定需要回滚的异常类型。

  3. 事务传播行为设置不当:Spring事务支持多种事务传播行为,例如REQUIRED、REQUIRES_NEW、NESTED等。如果在调用方法时,事务传播行为设置不当,可能导致事务失效。例如,如果在一个已经存在事务的方法中调用了一个事务传播行为为REQUIRES_NEW的方法,那么内部方法将会创建一个新的事务,而不是加入外部方法的事务。

  4. 方法未被代理:Spring事务是通过代理机制实现的,只有通过代理调用的方法才会受到事务管理的影响。如果在同一个类中调用带有@Transactional注解的方法,事务将无法生效。可以通过将带有@Transactional注解的方法放在另一个类中,然后通过依赖注入的方式调用,确保方法被代理。

  5. 数据库引擎不支持事务:虽然Spring框架本身支持事务管理,但是事务的实现依赖于底层数据库引擎的支持。如果使用的数据库引擎不支持事务,那么Spring事务将无法生效。

  6. 未启用事务管理器:在Spring应用程序中,需要配置事务管理器来启用事务支持。如果未正确配置事务管理器,事务将无法生效。通常,需要在Spring配置文件中配置适当的事务管理器,例如DataSourceTransactionManager。

这些是一些导致Spring事务失效的常见场景。在使用Spring事务时,需要注意以上因素,确保事务能够正确生效,以保证数据的一致性和完整性。


总结

  • 本文简单讲述了Spring事务是什么、Spring事务使用的简单示例和Spring事务的传播行为以及Spring事务失效的场景。
  • 欢迎大家提出建议以及批评,有任何问题可以私信。
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Spring 事务
最后更新:2023年 12月 12日

小呆呆

知足常乐,就会拥有幸福

点赞

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

小呆呆

知足常乐,就会拥有幸福

最新 热点 随机
最新 热点 随机
数据库索引简析 Java多线程的使用场景以及线程的创建方式 Spring事务的使用示例和传播行为以及失效场景 Spring Boot使用JUnit和Mockito进行Service层单元测试 Spring Cloud Zuul和Gateway的简单示例(搭建方式) Spring Cloud的网关Zuul和Gateway
数据库索引简析 Vue项目快速搭建 SpringCloud五大核心组件 SpringCloud项目搭建方式 Spring Cloud Feign的理解以及搭建方式(Feign调用简单示例) Github被墙(DNS污染)无法访问
标签聚合
Spring MySQL SpringCloud 干货 面试 Java 后端 SpringBoot
最近评论
我是可是尼古拉斯·爱新觉·罗·G·钰豪啊 发布于 3 年前(04月08日) 我来注水了胜哥 :hehe:
鸟人金 发布于 3 年前(03月03日) v
鸟人金 发布于 3 年前(03月03日) 胜哥yyds
鸟人金 发布于 3 年前(03月03日) 我滴偶像!!!!!!!!!!!!!!!
水军2号 发布于 3 年前(03月03日) 胜哥tql
归档
  • 2024 年 2 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2022 年 11 月
  • 2022 年 8 月
  • 2022 年 6 月
  • 2022 年 4 月
  • 2022 年 3 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 9 月
  • 2021 年 8 月
  • 2021 年 6 月
  • 2021 年 4 月
  • 2020 年 10 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 6 月
  • 2020 年 5 月
  • 2020 年 4 月
  • 2020 年 3 月

COPYRIGHT © 2023 小呆呆的生活. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2020104583号

粤公网安备44011802000463号