首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring data jpa嵌套事务回滚不删除插入?

Spring Data JPA是Spring框架提供的一种简化数据库访问的方式,它通过使用JPA(Java Persistence API)来实现对关系型数据库的操作。嵌套事务是指在一个事务中调用了另一个事务,而嵌套事务回滚不删除插入是指在嵌套事务中发生回滚操作时,之前已经执行的插入操作不会被撤销。

在Spring Data JPA中,默认情况下,嵌套事务是不会回滚的。这是因为Spring事务管理器默认使用的是基于AOP的声明式事务管理,而嵌套事务的回滚需要使用基于数据库的保存点机制,而不是简单的回滚操作。如果需要实现嵌套事务的回滚,可以使用编程式事务管理方式,并手动设置保存点。

以下是一个示例代码,演示了如何在Spring Data JPA中实现嵌套事务的回滚不删除插入:

代码语言:txt
复制
@Service
@Transactional
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void nestedTransaction() {
        try {
            // 执行插入操作
            userRepository.save(new User("John"));
            // 抛出异常,触发回滚
            throw new RuntimeException("Something went wrong");
        } catch (Exception e) {
            // 处理异常
        }
    }
}

在上述代码中,nestedTransaction方法使用了@Transactional注解,表示该方法是一个事务。同时,使用propagation = Propagation.REQUIRES_NEW设置了嵌套事务的传播行为为新建事务,即在该方法中开启一个新的事务。rollbackFor = Exception.class表示遇到任何异常都会触发回滚操作。

需要注意的是,嵌套事务的回滚不会删除之前已经执行的插入操作,这是因为在嵌套事务中,回滚操作只会回滚到保存点,而不会回滚到事务的起点。

关于Spring Data JPA的更多信息,您可以参考腾讯云的相关产品文档:Spring Data JPA

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

spring事务为什么生效,失效,事务try catch

新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败之后,不能内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以处理操作 PROPAGATION_SUPPORTS...PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以的保存点。...try { a(category); //内部类调用,走AOP,事务不起作用,加入a()报错了,插入仍然有效,相当于普通调用 b(category);...a、b、e不回主要看是否抛出异常。 spring 什么情况下进行事务?...异常,即Exception可try{}捕获的不会.当然也可配置spring参数让其.

3.1K10

Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持

到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇《Spring Data JPA系列1:JDBC、ORM、JPASpring Data JPA,傻傻分不清楚...因为这个里的操作都是一些只读操作,所以设置为只读事务,数据库会为只读事务提供一些优化手段,比如不启动段、记录log之类的。...,当方法中抛出指定类型的异常时,不进行事务。...《Spring Data JPA用法与技能探究》系列涵盖内容: 开篇介绍 —— 《Spring Data JPA系列1:JDBC、ORM、JPASpring Data JPA,傻傻分不清楚?...快速上手 —— 《Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA》 深度进阶 —— 《Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

86810

SpringBoot中@Transaction在不同MySQL引擎下的差异性

在springboot进行事务测试的时候,发现事务没有生效,在方法上添加了@Transactional注解并让方法先执行插入操作,接着再抛出个异常,触发事务,代码如下: @Transactional...throw new Exception("test throw exception and rollback the transaction..."); } 实际测试的时候发现,事务并没有效果...,数据已经插入到DB中: 搜索了下,发现有人提到说MySQL数据库的事务生效,可能和引擎类型有关系,因此下一步往这个方向排查一下。...再次运行测试工程,发现事务生效了。 为什么事务对MyISAM引擎生效呢 为什么Spring事务无法控制MySQL的MyISAM引擎类型数据表操作呢?...它们不是事务安全的,而且也不支持外键。如果事物将造成不完全,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。 InnoDB:这种类型是事务安全的。

1K20

Spring JDBC-Spring事务管理的支持

如果 addCredits()对应的内嵌事务执行失败,事务将回滚到addCredits()方法执行前的点,并不会将整个事务。...内嵌事务是内层事务的一 部分,所以只有外层事务提交时,嵌套事务才能一并提交。 嵌套事务不能够提交,它必须通过外层事务来完成提交的动作,外层事务也会造成内部事务。...PROPAGATION_REQUIRES_NEW 启动一个新的、和外层事务无关的“内部”事务。该事务拥有自己的独立隔离级别和锁,不依赖于外部事务,独立地提交和。..., 而 PROPAGATION_NESTED 将创建一个依赖于外层事务的子事务,当外层事务提交或时,子事务也会连带提交和。...,未插入数据, OK。

58820

Spring事物的传播行为案例分析

JTA和JPA以及Herbernate等,这里就不展开说明,可自行百度。...事务的传播特行为为required  结果是因为主键冲突将事务进行了,所以两条数据都没有插入进去。...事务的传播行为required_new(代码注释清忽略)  结果和require一样,两条数据都没有入库,唯一健冲突导致第一条数据,大家可以思考下我下面这两种情况。 ?...情景1新起的事务抛出异常会不会让外围事务? ? 情景2外围事务失败会不会导致新起事务已提交的?...事务的传播行为NEVER 8、 propagation_nested,这种嵌套事务,外围如果没有事务则自己另起一个事务,可独立与外围事务进行单独的提交或者回(这句话不要理解错了),下面这个案例同样的数据一条也没有落入库中

55610

SpringBoot 2.x 教你快速入门

=true #springboot 2.x 不加这句则默认为myisam引擎,该引擎不会事务,添加如下可将引擎修改为innodb,事务 spring.jpa.database-platform...也可以在每个方法上添加事务,会默认以方法上添加的事务为前提,如果没有就以service类上的注解为准 SpringBoot 2.x JPA 默认引擎为 myisam ,这个不支持事务,会出现添加事务注解...此时在application.properties 中,需要将引擎修改为innodb,这个是支持事务的!...#不加这句则默认为myisam引擎,该引擎不会事务,添加如下:在application.properties 中可将引擎修改为 innodb spring.jpa.database-platform...这就实现了事务! 以上便是SpringBoot 2.x 快速入门的所有内容,教你快速创建一个Web项目!

82330

spring 事务机制的个人总结

❞ https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#spring-data-tier...「丢失」(第一类事务丢失):丢失指A事务提交了,但是B事务事务滚了,当A提交成功但是B因为事务滚了A的数据,这时候对于A来说事务就算是丢失了。...但是由于有共同的方法所以需要使用 「模板方法」的模式控制抽象和模板方法的不同细节,最后最重要的是如何实现嵌套事务以及多线程访问的时候源保持线程的隔离呢?...JPA本身是一个规范,基于此规范实现的产品有:Hibernate, Eclipselink, Toplink, Spring Data JPA, etc等,其中最典型的实现是ORM的鼻祖Hibernate...嵌套事务意味着可以实现部分事务,但是嵌套的内部事务不会影响外部事务的执行。

99310

ruoyi-vue版本(三十)事务介绍和使用

spring-boot-starter-data-jpa的依赖。...例如用户新增需要插入用户表、用户与岗位关联表、用户与角色关联表,如果插入成功,那么一起成功,如果中间有一条出现异常,那么之前的所有操作, 这样可以防止出现脏数据,就可以使用事务让它实现回退。...,也无法。...."); } return rows; } 原因分析:因为Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会。...这是许多新手都会犯的一个错误,在业务层手工捕捉并处理了异常,你都把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去数据。 例如:下面这段代码直接导致用户新增的事务没有生效。

52530

JPAHibernate问题汇总

于是当一个事务方法A去调用了另一个事务方法B时,指明事务传播级别,那么事务方法B依然使用方法A的事务。...当方法A继续执行完毕,在最后提交事务时,会发现当前事务已经被标记为rollback-only状态,于是整个事务并抛出UnexpectedRollbackException异常。...在这种情况下,一般有两种处理场景: 只有方法B在遇到异常时事务,且不影响到方法A的事务提交,那么此时方法B的事务要指明为PROPAGATION_NESTED。...但是,JPA默认实现是Hibernate,而Hibernate不提供事务嵌套。...对于这种情况,要么使用其他的JPA实现,要么在方法B中将可能发生的异常try-catch并且不往外抛出,但此时方法B将不能自动事务。 方法B发生异常时,和方法A一起事务

2.5K20

springboot事物oracle,SpringBoot 事务管理

org.springframework.boot spring-boot-starter-jdbc org.springframework.boot spring-boot-starter-data-jpa...事务 在讲事务隔离级别和事务传播性之前,先讲一下SpringBoot中,我们平常是怎样控制事务的。...().setRollbackOnly():捕获特定异常或自行判断后手动 3....事务传播行为 事务传播行为指的是,由某个事务传播行为(propagation)修饰的方法被嵌套进另一个方法中时,事务是如何传播的。...; NEVER:非事务方式运行,如当前存在事务,则抛出异常; NESTED:如当前存在事务,则创建一个事务作为当前事务的子事务运行,随当前事务一起提交,当前事务滚子事务,子事务可以独立,当前事务不会

61110

Spring Boot 2.x基础教程:事务管理入门

快速入门 在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager...所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。 我们以之前实现的《使用Spring Data JPA访问MySQL》的示例作为基础工程进行事务的使用学习。...在该样例工程中(若对该数据访问方式不了解,可先阅读该前文),我们引入了spring-data-jpa,并创建了User实体以及对User的数据访问对象UserRepository,在单元测试类中实现了使用...这里主要通过单元测试演示了如何使用@Transactional注解来声明一个函数需要被事务管理,通常我们单元测试为了保证每个测试之间的数据独立,会使用@Rollback注解让每个单元测试都能在结束时...对于不同数据源的事务管理配置可以见《Spring Data JPA的多数据源配置》中的设置。

64510
领券