SpringBoot事务注解超详细讲解

 更新时间:2023年11月27日 09:11:00   作者:Kero小柯  
这篇文章主要给大家介绍了关于SpringBoot事务注解的相关资料,在Spring Boot中,事务管理是一个非常重要的概念,我们可以使用事务注解来控制事务的行为,文中通过代码介绍的非常详细,需要的朋友可以参考下

@Transactional

spring 事务注解

1.简单开启事务管理

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />

2.事务注解详解

默认遇到throw new RuntimeException(“…”);会回滚 

需要捕获的throw new Exception(“…”);不会回滚

指定回滚

@Transactional(rollbackFor=Exception.class) 
    public void methodName() {
       // 不会回滚
       throw new Exception("...");
    }

指定不回滚

@Transactional(noRollbackFor=Exception.class)
    public ItimDaoImpl getItemDaoImpl() {
        // 会回滚
        throw new RuntimeException("注释");
    }

如果有事务,那么加入事务,没有的话新建一个(不写的情况下)

@Transactional(propagation=Propagation.REQUIRED)

容器不为这个方法开启事务

@Transactional(propagation=Propagation.NOT_SUPPORTED)

readOnly=true只读,不能更新,删除

@Transactional (propagation = Propagation.REQUIRED,readOnly=true)

设置超时时间

@Transactional (propagation = Propagation.REQUIRED,timeout=30)

设置数据库隔离级别

@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)

3.指定事务管理器

spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。

关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。

你可以在启动类中添加如下方法,Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。

3.1 打印项目事务管理器

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication {

    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager){
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
        return new Object();
    }

    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}

这些SpringBoot为我们自动做了,这些对我们并不透明,如果你项目做的比较大,添加的持久化依赖比较多,我们还是会选择人为的指定使用哪个事务管理器。 
代码如下:

3.2 指定事务管理器

@EnableTransactionManagement
@SpringBootApplication
public class ProfiledemoApplication {

    // 其中 dataSource 框架会自动为我们注入
    @Bean
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public Object testBean(PlatformTransactionManager platformTransactionManager) {
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
        return new Object();
    }

    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}

在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。

然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。

对于同一个工程中存在多个事务管理器要怎么处理,请看下面的实例,具体说明请看代码中的注释。

3.3 使用指定的事务管理器

@EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
@SpringBootApplication
public class ProfiledemoApplication implements TransactionManagementConfigurer {

    @Resource(name="txManager2")
    private PlatformTransactionManager txManager2;

    // 创建事务管理器1
    @Bean(name = "txManager1")
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    // 创建事务管理器2
    @Bean(name = "txManager2")
    public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
        return new JpaTransactionManager(factory);
    }

    // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return txManager2;
    }

    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }

}

@Component
public class DevSendMessage implements SendMessage {

    // 使用value具体指定使用哪个事务管理器
    @Transactional(value="txManager1")
    @Override
    public void send() {
        System.out.println(">>>>>>>>Dev Send()<<<<<<<<");
        send2();
    }

    // 在存在多个事务管理器的情况下,如果使用value具体指定
    // 则默认使用方法 annotationDrivenTransactionManager() 返回的事务管理器
    @Transactional
    public void send2() {
        System.out.println(">>>>>>>>Dev Send2()<<<<<<<<");
    }

}

总结 

到此这篇关于SpringBoot事务注解超详细讲解的文章就介绍到这了,更多相关SpringBoot事务注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java字符串切割实例学习(获取文件名)

    java字符串切割实例学习(获取文件名)

    在Java中处理一些路径相关的问题的时候,如要取出ie浏览器上传文件的文件名,由于ie会把整个文件路径都作为文件名上传,需要用java.lang.String中的replaceAll或者split来处理,下面看看使用方法
    2013-12-12
  • APP转盘抽奖Java服务端接口详解

    APP转盘抽奖Java服务端接口详解

    这篇文章主要为大家详细介绍了APP转盘抽奖Java服务端接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 在IDEA中搭建最小可用SpringMVC项目(纯Java配置)

    在IDEA中搭建最小可用SpringMVC项目(纯Java配置)

    这篇文章主要介绍了在IDEA中搭建最小可用SpringMVC项目(纯Java配置),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    本篇文章主要介绍了SpringMVC的相关知识。同时也会介绍到js、css这些静态文件的加载配置,以及服务器推送的两种实现方式并且给出了两者的区别。下面跟着小编一起来看下吧
    2017-04-04
  • java8学习教程之函数引用的使用方法

    java8学习教程之函数引用的使用方法

    这篇文章主要给大家介绍了关于java8学习教程之函数引用的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。
    2017-09-09
  • springboot实现配置文件关键信息加解密

    springboot实现配置文件关键信息加解密

    在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot实现配置文件关键信息加解密吧
    2025-05-05
  • Java中的OpenTracing使用实例

    Java中的OpenTracing使用实例

    这篇文章主要介绍了Java中的OpenTracing使用实例,主要的OpenTracing API将所有主要组件声明为接口以及辅助类,例如Tracer,Span,SpanContext,Scope,ScopeManager,Format(用映射定义通用的SpanContext注入和提取格式),需要的朋友可以参考下
    2024-01-01
  • Springboot核心机制详细介绍

    Springboot核心机制详细介绍

    SpringBoot的核心机制包括自动配置、起步依赖、主类和运行器、以及嵌入式服务器等,通过这些机制,SpringBoot简化了应用开发过程,本文给大家介绍Springboot核心机制,感兴趣的朋友一起看看吧
    2024-11-11
  • 使用Java将字符串转换为十进制ASCII码的代码实现

    使用Java将字符串转换为十进制ASCII码的代码实现

    在 Java 开发中,将字符串转换为十进制 ASCII 码是一个看似简单、实则蕴含丰富计算机科学基础的操作,本文将从编码本质、Java 内部机制、常见场景、边界考量以及最佳实践等维度,系统性地探讨这一主题,需要的朋友可以参考下
    2026-05-05
  • Java根据code获取枚举优化方式

    Java根据code获取枚举优化方式

    文章介绍了如何优化枚举类根据code获取枚举类型的过程,通过创建基接口BaseEnum和枚举工具类MyEnumUtil,实现了通用的获取方法,同时,还讨论了根据description获取枚举的优化方法,并建议使用第二种方法
    2026-03-03

最新评论