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

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

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

@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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

@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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

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

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

@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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

@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()<<<<<<<<");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

如果Spring容器中存在多个 PlatformTransactionManager 实例,并且没有实现接口 TransactionManagementConfigurer 指定默认值,在我们在方法上使用注解 @Transactional 的时候,就必须要用value指定,如果不指定,则会抛出异常。

对于系统需要提供默认事务管理的情况下,实现接口 TransactionManagementConfigurer 指定。

对有的系统,为了避免不必要的问题,在业务中必须要明确指定 @Transactional 的 value 值的情况下。不建议实现接口 TransactionManagementConfigurer,这样控制台会明确抛出异常,开发人员就不会忘记主动指定。

Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio... 来自: JavaAlliance 玩转Spring Boot 事务管理 Spring Boot 使用的是Spring 事务管理机制,Spring事务对事务管理提供了一个顶层的接口PlatformTransactionManager,对... 来自: 成立的博客 基本配置见上一篇博客spring boot实现数据库的事务功能很简单,只需要在需要事务方法或类上添加@Transactiona注解即可。看下面的例子:首先建立account数据库表,并确保类型为Inn... 来自: lillllllll的专栏 一般情况下,我们创建了一个Spring Boot程序之后,按照默认的配置就可以启动了,但是我们还是可以自定义一些配置以及修改一些配置一:多个环境的文件配置由于一个项目在开发的过程当中,需要经历开发测试... 来自: 你好,我们在哪里见过啊! Spring Boot整合事务管理在Spring Boot中推荐使用@Transactional注解来申明事务。首先需要导入依赖:dependency> groupId>org.... 来自: C. 文章目录概述@Autowired注解@Autowired的匹配原则@Autowired的 required 属性使用@Primary 和@Qualifier消除@Autowired的歧义@Primar... 来自: 小工匠 文章目录概述示例概述Spring Boot主要是通过注解来装配 Bean 到 Spring IoC 容器中,使用注解装配Bean就不得不提AnnotationConfigApp licationCon... 来自: 小工匠 Spring Boot的条件注解位于org.springframework.boot.autoconfigure.condition包下,其对应的处理类在它上面的Conditional注解里声明。Sp... 来自: 周先生丶的博客 spring boot基于注解的声明式事务配置事务配置1、配置方式一 1)开启spring事务管理,在spring boot启动类添加注解@EnableTransactionManagement(pr... 来自: Kai辉的专栏 Spring Boot中的注解​ 实际开发过程中Spring Boot常用的注解有以下几个@RestController@RequestMapping@PathVariable@RequestPara... 来自: qq_38238296的博客 Spring Boot 常用注解常见注解1. @SpringBootApplication 申明让spring boot自动给程序进行必要的配置, 等价于以默认属性使用@Configuration,@... 来自: Smile0305的博客 Springboot之@Value注解的使用总结liguo.wang@hand-china.com简单介绍Spring框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了Spr... 来自: hunan961的博客 Spring Boot最核心的20个注解说完与Spring Boot密切相关的几个Spring基础注解后,下面我们就再一起看看Spring Boot提供的核心注解的内容吧!1、@SpringBootA... 来自: liinux-Talk is cheap,show me the code. 可以说条件注解是spring boot的一个重要的基石,像之前我们常用的profile都是条件注解的一个特殊化,这篇文章主要来整理一下条件注解的实现创建maven项目创建一个简单的maven项目,引入... 来自: zhouym_的博客 今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。目录:你以为的人生 一次又一次的伤害 猎头界的真... 来自: 启舰 大家好,我是 Rocky0429,一个喜欢在 GitHub 上瞎逛的蒟蒻…好看的皮囊千篇一律,有趣的灵魂没有底线。作为全球最大的同性交友网站,GayHub GitHub 上不止有鲜活的代码,秃头的算法... 来自: Rocky0429 作者 | Rocky0429来源 | Python空间大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻…网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网... 来自: Rocky0429 周末躺在床上看《拯救大兵瑞恩》周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。01、Alibaba Java 代码规... 来自: 沉默王二 相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢?我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果:搜索一下:产品经理猝死,只有400万条的搜索结果,从搜... 来自: 曹银飞的专栏 每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。”今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老... 来自: 沉默王二 上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。我下面就把我日常工作和学习中经常用到的一些 Chr... 来自: 不忘初心 我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。最初在有网... 来自: c旋儿的博客 Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢?作者 |Richard Kenneth Eng译者 |明明如月,责编 | 郭芮出品 | ... 来自: CSDN资讯 是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...... 来自: CSDN资讯 最近和几个 AI 领域的大佬闲聊根据他们讲的消息和段子改编出下面这个故事如有雷同都是巧合1. 老王创业失败,被限制高消费“这里写我跑路的消息实在太夸张了。”王葱葱哼笑一下,把消息分享给群里。阿杰也看了... 来自: CSDN 官方博客 点击“技术领导力”关注∆每天早上8:30推送作者|Mr.K 编辑| Emma来源|技术领导力(ID:jishulingdaoli)前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者... 来自: 技术领导力 1.Robocode让坦克们互相博弈的游戏,你可以看到它们飞奔,碾碎一切挡道的东西。机器人配有雷达与火炮,选手在躲避对手进攻的同时攻击对手,以此来较量得分的多少。这个游戏很有意思,曾经令我沉迷…你可以... 来自: 九章算法的博客 2020年刚刚开始,就意味着离职潮高峰的到来,我身边就有不少人拿着年终奖离职了,而最让我感到意外的,是一位工作十年的数据分析师也离职了,不同于别人的主动辞职,他是被公司炒掉的。很多人都说数据分析是个好... 来自: Leo的博客 B站是个宝,谁用谁知道????作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不... 来自: 编码之外的技术博客 教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。斑羚飞渡在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》:随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,... 来自: hebtu666 Spring在多线程的情况下,如何... u010963948: [reply]Saintyyu[/reply]也是一样的,正常情况下,线程里面跑出的异常,外面是捕获不到的,可以考虑使用volatile声明的变量控制线程退出情况。

Spring在多线程的情况下,如何... Saintyyu: 用Future呢?

Mysql关于分库、分表、分区的具... dimingchan: 谢谢楼主分享啦!

Spring Boot的事务管理注... qq_42169013: 博主您好,我这边按照您的配置 事务还是不生效