SpringBoot中手动开启事务的实现方法

 更新时间:2025年11月24日 11:02:46   作者:m***6673  
在Spring Boot中,除了使用@Transactional注解外,还可以通过TransactionTemplate或PlatformTransactionManager手动控制事务,本文给大家介绍SpringBoot中如何手动开启事务,感兴趣的朋友跟随小编一起看看吧

在Spring Boot中,虽然大多数情况下推荐使用@Transactional注解来管理事务,但有时需要更灵活地手动控制事务。这可以通过TransactionTemplate或PlatformTransactionManager来实现

一、使用 TransactionTemplate

TransactionTemplate是Spring提供的一个模板类,用于简化事务管理。

1、配置 TransactionTemplate

(首先,确保你的项目已经配置了数据源和事务管理器(Spring Boot通常会自动配置这些))。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
@Configuration
public class TransactionConfig {
    @Bean
    public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }
}

2、使用 TransactionTemplate

在需要手动管理事务的服务类中注入并使用TransactionTemplate:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
@Service
public class MyService {
    @Autowired
    private TransactionTemplate transactionTemplate;
    public void saveData() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(org.springframework.transaction.TransactionStatus status) {
                try {
                    // 伪代码
                    // myRepository.save(new MyEntity("Data 1"));
                    // myRepository.save(new MyEntity("Data 2"));
                    // Simulate an exception to trigger a rollback
                    if (true) {
                        throw new RuntimeException("Simulated exception");
                    }
                    // myRepository.save(new MyEntity("Data 3"));
                } catch (RuntimeException e) {
                    // Rollback transaction if exception occurs
                    status.setRollbackOnly();
                    throw e;
                }
            }
        });
    }
}

二、使用 PlatformTransactionManager 直接管理事务

PlatformTransactionManager接口提供了更细粒度的事务控制,适用于需要复杂事务管理的场景。

1、注入 PlatformTransactionManager

在需要手动管理事务的服务类中注入PlatformTransactionManager:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class MyService {
    @Autowired
    private PlatformTransactionManager transactionManager;
    public void performTransactionalOperation() {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setName("myTransaction");
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // Perform database operations here
            // myRepository.save(new MyEntity("Data 1"));
            // myRepository.save(new MyEntity("Data 2"));
            // Simulate an exception to trigger a rollback
            if (true) {
                throw new RuntimeException("Simulated exception");
            }
            // myRepository.save(new MyEntity("Data 3"));
            // Commit transaction
            transactionManager.commit(status);
        } catch (RuntimeException e) {
            transactionManager.rollback(status);
            throw e;
        }
    }
}

到此这篇关于SpringBoot中手动开启事务的实现方法的文章就介绍到这了,更多相关SpringBoot手动开启事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈shiro的SecurityManager类结构

    浅谈shiro的SecurityManager类结构

    下面小编就为大家带来一篇浅谈shiro的SecurityManager类结构。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java中try catch 的基本用法示例

    Java中try catch 的基本用法示例

    这篇文章主要给大家介绍了关于Java中try catch 的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 在SpringBoot项目中动态切换数据源和数据库的详细步骤

    在SpringBoot项目中动态切换数据源和数据库的详细步骤

    在许多企业级应用中,可能需要根据不同的业务需求来切换不同的数据库,如读写分离、分库分表等场景,Spring Boot 提供了灵活的数据源配置方式,本文将介绍如何在 Spring Boot 项目中实现动态切换数据源和数据库的方案,需要的朋友可以参考下
    2025-08-08
  • SpringBoot 使用 @Configuration 集中管理 Bean的实战步骤

    SpringBoot 使用 @Configuration 集中管理 Bean的实

    在 SpringBoot 中,@Configuration 注解是专门用来集中管理 Bean 的核心方案,它可以替代传统 XML 配置文件,本文给大家介绍SpringBoot使用@Configuration集中管理 Bean的实战步骤,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • idea热部署且开启自动编译的实现方法

    idea热部署且开启自动编译的实现方法

    这篇文章主要介绍了idea热部署且开启自动编译的实现方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • eclipse上配置Maven的图文教程(推荐)

    eclipse上配置Maven的图文教程(推荐)

    下面小编就为大家分享一篇eclipse上配置Maven的图文教程(推荐),具有很好的参考价值。希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • RestTemplate报错400 Bad Request的解决方案

    RestTemplate报错400 Bad Request的解决方案

    在使用Spring Boot时,若直接通过@Autowired注入RestTemplate可能会遇到400BadRequest错误,原因在于Spring Boot官方文档指出,由于RestTemplate实例通常需要在使用前进行定制,因此Spring Boot不会自动配置单个RestTemplate Bean
    2024-11-11
  • Java 定时器(Timer,TimerTask)详解及实例代码

    Java 定时器(Timer,TimerTask)详解及实例代码

    这篇文章主要介绍了 Java 定时器(Timer,TimerTask)详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • 详解什么是Java线程池的拒绝策略?

    详解什么是Java线程池的拒绝策略?

    今天给大家总结一下线程池的拒绝策略,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Spring Security基于过滤器实现图形验证码功能

    Spring Security基于过滤器实现图形验证码功能

    验证码就是为了防止恶意用户采用暴力重试的攻击手段而设置的一种防护措施,接下来在Spring Security的环境中,我们可以用两种方案实现图形验证码,具体实现方法跟随小编一起看看吧
    2021-09-09

最新评论