Spring boot spring boot@transactional未在异常时回滚,声称成功的回滚规则为:RollbackRuleAttribute with pattern

Spring boot spring boot@transactional未在异常时回滚,声称成功的回滚规则为:RollbackRuleAttribute with pattern,spring-boot,exception,transactions,rollback,Spring Boot,Exception,Transactions,Rollback,在阅读了这么多资料并在谷歌上搜索了任何可能的途径之后,我求助于您的帮助: 我在@service类中有一个公共方法,它通过@repository提交一些事务。尽管我声明事务将在异常时回滚(并尝试覆盖更一般的类,如运行时异常、Throwable等),但它不会回滚,而是在抛出上述异常后仍在数据库中提交。 在日志级别记录事务后,我得到以下几行: Completing transaction for [org.springframework.data.jpa.repository.support.Simp

在阅读了这么多资料并在谷歌上搜索了任何可能的途径之后,我求助于您的帮助:

我在@service类中有一个公共方法,它通过@repository提交一些事务。尽管我声明事务将在异常时回滚(并尝试覆盖更一般的类,如运行时异常、Throwable等),但它不会回滚,而是在抛出上述异常后仍在数据库中提交。
在日志级别记录事务后,我得到以下几行:

Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.updateCategoryOrder]
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@66a50c93] for key [public abstract void com.aliza.davening.repositories.CategoryRepository.updateCategoryOrder(int,long)] from thread [main]
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.aliza.davening.services.AdminService.changeCategoryOrder] after exception: exceptions.ReorderCategoriesException: Now everything should stay the same.
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] o.s.t.i.RuleBasedTransactionAttribute    : Applying rules to determine whether transaction should rollback on exceptions.ReorderCategoriesException: Now everything should stay the same.
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] o.s.t.i.RuleBasedTransactionAttribute    : 
**Winning rollback rule is: RollbackRuleAttribute with pattern [exceptions.ReorderCategoriesException]**
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] .s.t.s.TransactionSynchronizationManager : Clearing transaction synchronization
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.orm.jpa.EntityManagerHolder@6442cf3e] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7e1fb22c] from thread [main]
2020-01-01 14:22:40.795 TRACE 1580 --- [           main] .s.t.s.TransactionSynchronizationManager : Removed value [org.springframework.jdbc.datasource.ConnectionHolder@7b4c793b] for key [HikariDataSource (HikariPool-1)] from thread [main]
Exception in thread "main" exceptions.ReorderCategoriesException: Now everything should stay the same.
从日志中可以看出,他确实考虑了退后的选择,只是在评估我提供的规则是否足够时陷入了困境。
我用黑体字写的“获胜规则”是不是意味着他决定退出?如果是,为什么要提交事务

或者,如果“获胜规则”意味着他认为我提供的规则不足以回滚,我如何使此回滚规则工作

代码如下:

@Service(“adminService”)
@启用事务管理
@事务性(rollbackFor=ReorderCategoriesException.class)
公共类管理服务{
公共无效changeCategoryOrder()
抛出ReorderCategoriesException{
//updateCategoryOrder接受类别的顺序和id
更新分类顺序(1,4);
分类报告。更新分类顺序(2,11);
更新分类顺序(3,9);
//我认为,从理论上讲,这个异常应该会导致以前的提交回滚?
抛出新的ReorderCategoriesException(“现在一切都应该保持不变。”);
}
}
以下是执行DB操作的存储库类:

@存储库
公共接口类别repository扩展了JpaRepository{
@修改
@交易的
@查询(“更新类别集catOrder=?1,其中id=?2”)
public void updateCategoryOrder(int newOrder,long categoryId);
}
异常的定义如下:(我尝试从exception和RuntimeException继承,结果相同)

包异常;
@抑制警告(“串行”)
公共类ReorderCategoriesException扩展了RuntimeException{
公共ReorderCategoriesException(字符串消息){
超级(味精);
}
}
最后,这是我如何从main调用该方法的:

@springboot应用程序
@启用自动配置
@启用事务管理
公共类MyApplication{
公共静态void main(字符串[]args)引发ReorderCategoriesException{
ConfigurableApplicationContext上下文=SpringApplication.run(MyApplication.class,args);
AdminService AdminService=context.getBean(AdminService.class);
adminService.changeCategoryOrder();
}
pom.xml文件(包括spring引导自动配置依赖项)如下所示:


4.0.0
org.springframework.boot
spring启动程序父级
2.1.9.1发布
com.my-project
项目
0.0.1-快照
项目名称
SpringBoot的演示项目
1.8
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
春季启动邮件
org.springframework.boot
SpringBootStarterWeb
mysql
mysql连接器java
运行时
org.springframework.boot
弹簧起动试验
测试
org.springframework.boot
弹簧靴自动配置
公地io
公地io
2.6
org.springframework.boot
springbootmaven插件

如果您有任何帮助或见解,请在抛出异常时回滚DB操作。

请共享pom.xml,还需要指定@EnableTransactionManagement注释。默认情况下,该注释处于启用状态。请指定spring-boot-autoconfigure.jar作为依赖项并重试。您是否可以尝试实现自定义异常扩展
org.springframework.core.NestedRuntimeException
而不是
RuntimeException
?不确定它是否会工作,但问题可能是因为自定义异常只有一个构造函数-
Throwable
还有一个构造函数,它同时接受
字符串
消息和
Throwable
原因。@ChristianMeyer,尝试过,但没有帮助。@dassum我确实在服务类和主类中指定了注释(只是为了确定……因为我不知道注释应该放在哪里。无论如何都没有帮助)。我在pom.xml文件中添加了依赖项(仍然不起作用)请共享pom.xml,您还需要指定@EnableTransactionManagement注释。默认情况下,该注释处于启用状态。将spring-boot-autoconfigure.jar指定为依赖项并重试。您是否可以尝试实现自定义异常扩展
org.springframework.core.NestedRuntimeException
而不是
RuntimeException
?不确定它是否会工作,但问题可能是因为您的自定义异常只有一个构造函数-
Throwable
也有一个构造函数,该构造函数同时接受
字符串和
Throwable
原因。@ChristianMeyer,尝试过,但没有帮助。@dassum我确实指定了原因服务类和主类中的旋转(只是为了确定…因为我不知道它应该放在哪里。我不知道