首页 > 其他分享 >记一次spring 事务失效的解决

记一次spring 事务失效的解决

时间:2023-06-01 10:11:54浏览次数:34  
标签:事务 管理器 spring Transactional Spring 失效 注解

我们项目既有使用spring JPA也有使用spring JdbcTemplate,此次事务失效的原因是,项目之前配置的是spring jpa 的专门的事务管理器。
第一次尝试解决:添加spring JdbcTemplate 的事务管理器,并添加相应的注解驱动。不生效!!!
第二次尝试解决:问了下chartgpt,
如果在Spring配置文件中启用了多个注解驱动事务管理,那么在使用事务注解时,需要指定使用哪个事务管理器。可以使用@Transactional注解的value属性来指定事务管理器的名称或ID。

@Transactional(value = "transactionManager1")
public void doSomething() {
    // ...
}
@Transactional(value = "transactionManager2")
public void doSomethingElse() {
    // ...
}

终于生效了!!!

此次解决明确了几件事:
1.接口使用default不影响事务
2.JdbcTemplate 注入用@Resource不影响事务

顺便列下事务失效的常见原因:

1、方法没有被public修饰

在开发过程中,如果@Transactional事务注解添加在不是public修饰的方法上,这个时候,Spring的事务就会失效。

2、类没有被Spring托管

如果事务方法所在的类没有加载到Spring IoC容器中,也就是说,事务方法所在的类没有被Spring管理,从而导致Spring无法实现代理,所以,Spring事务也会失效。

3、不正确的异常捕获

如果事务方法抛出异常被 catch 处理了,导致 @Transactional 无法回滚而导致事务失效。

4、同一类中方法调用

如果同一个类中的两个方法分别为A和B,方法A上没有添加事务注解,方法B上添加了 @Transactional事务注解,方法A调用方法B,那么,方法B的事务会失效。

5、propagation事务传播行为配置错误

如果内部方法的事务传播类型为不支持事务的传播类型,那么,内部方法的事务在Spring中会失效。

6、rollbackFor参数设置错误

如果在@Transactional注解中rollbackFor参数标注了错误的异常类型,那么,Spring事务的回滚就无法识别,导致事务回滚失效。

7、没有配置事务管理器

即使在代码中使用了Spring的事务管理的功能,但是在项目中,如果没有配置Spring的事务管理器,Spring的事务也不会生效。

8、数据库本身不支持事务

Spring事务生效的前提是所连接的数据库要支持事务,如果底层的数据库都不支持事务,那么,Spring的事务肯定会失效。例如,如果使用的数据库为MySQL,并且选用了MyISAM存储引擎,则Spring的事务就会失效。

标签:事务,管理器,spring,Transactional,Spring,失效,注解
From: https://www.cnblogs.com/jqccan/p/17448146.html

相关文章

  • 使用SpringMVC搭建第一个项目
    概述使用SpringMVC搭建第一个项目,入门教程,分享给大家。详细一、概述1、什么是SpringMVC?SpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构,从而在使用Sp......
  • 一天吃透Spring面试八股文
    内容摘自我的学习网站:topjavaer.cnSpring是一个轻量级的开源开发框架,主要用于管理Java应用程序中的组件和对象,并提供各种服务,如事务管理、安全控制、面向切面编程和远程访问等。它是一个综合性框架,可应用于所有类型的Java应用程序。SpringMVC是Spring框架中的一个模块,用......
  • [SprigMVC/SpringBoot] JSON序列化专题之日期序列化问题:接口报Jackson框架错误“Inva
    0序言今日工作中遇到的一个bug。各位看官且听我娓娓道来。1问题描述请求接口时,service层返回到controller层的数据结构为List<Map<Strig,Object>>,而Map中存在一个key=date,valuetype=java.time.LocalDate的Entry,且日志报如下错误:InvalidDefinitionException:Java8date......
  • Spring boot 使用 jpa 动态插入@DynamicInsert和动态更新@DynamicUpdate(动态指部分或
    @DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。@DynamicUpdate属性:设置为tru......
  • springsecurity配置内存中账号密码的配置(方便复制)。
    pom.xml的依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> springsecurity的配置文件:WebSecurityConfig.javaimportorg.aspectj.weaver.ast.A......
  • Spring Boot 定时任务单线程和多线程配置
    第一种:把参数配置到.properties文件中:代码:packagecom.accord.task;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;/***从配置文件加载......
  • Spring Boot缓存注解使用案例
    一、spring-boot-cache缓存1、pom<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><version>2.6.7</version></dependency>2、main启动类加入@EnableCachi......
  • SpringBoot集成Redis
    依赖包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><grou......
  • 《面试1v1》Spring基础
    我是javapub,一名Markdown程序员从......
  • 分布式事务
    分布式事务回顾事务什么是事务?一组对数据库的操作,整体要么一起成功,要么一起失败事务的特性?一致性原子性在项目中做事务控制?怎么做?在启动类上加@EnableTransactonManager事务加在service层,加在实现类上或者接口上,都可以@transactional分布式事务背景CAP:......