首页 > 其他分享 >关于事务回滚注解@Transactional

关于事务回滚注解@Transactional

时间:2024-07-09 09:53:54浏览次数:17  
标签:回滚 Transactional Spring void 事务 public 注解 class

在使用Spring的@Transactional注解时,有时会出现事务失效的情况。这通常是由于一些常见的配置或使用错误引起的。以下是事务失效的原因和处理方法:

常见原因

  1. 方法可见性 @Transactional注解的方法必须是public的。Spring AOP代理只会拦截public方法,非public方法(如privateprotected或默认可见性的方法)将不会被代理,因此事务将不会生效。

    @Transactional
    public void myTransactionalMethod() {
        // Method logic
    }

  2. 方法内部调用 如果在同一个类内部调用一个被@Transactional注解的方法,该注解将失效。这是因为Spring AOP基于代理机制,内部方法调用不会经过代理对象。

    public void nonTransactionalMethod() {
        myTransactionalMethod(); // This will not be transactional
    }

    解决方法:将事务方法移到另一个@Service类中,通过依赖注入调用。

    @Service
    public class MyService {
    
        @Autowired
        private AnotherService anotherService;
    
        public void nonTransactionalMethod() {
            anotherService.myTransactionalMethod();
        }
    }
    
    @Service
    public class AnotherService {
    
        @Transactional
        public void myTransactionalMethod() {
            // Method logic
        }
    }
  3. 代理机制 默认情况下,Spring AOP使用JDK动态代理或CGLIB代理。确保在Spring配置中启用了AOP支持:

    @Configuration
    @EnableTransactionManagement
    public class AppConfig {
        // Configuration beans
    }
  4. 事务传播行为 不正确的事务传播行为设置可能导致事务失效。例如,@Transactional(propagation = Propagation.NOT_SUPPORTED)将导致事务在当前方法中被挂起。

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void myTransactionalMethod() {
        // Method logic
    }
  5. 异常处理 事务只会在方法抛出未捕获的运行时异常(RuntimeException)时回滚。受检异常(CheckedException)默认不会导致事务回滚。

    @Transactional
    public void myTransactionalMethod() throws Exception {
        try {
            // Method logic
        } catch (SpecificException e) {
            throw new RuntimeException(e); // Ensure rollback
        }
    }
  6. Spring Boot 和 JPA 配置 如果使用Spring Boot和JPA,确保正确配置了事务管理器。

    @SpringBootApplication
    @EnableTransactionManagement
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

处理方法

  1. 检查方法可见性:确保被@Transactional注解的方法是public的。
  2. 避免内部方法调用:将事务方法移到另一个服务类中,通过依赖注入调用。
  3. 启用AOP支持:在Spring配置中启用事务管理和AOP支持。
  4. 正确设置传播行为:根据需求设置正确的事务传播行为。
  5. 正确处理异常:确保抛出未捕获的运行时异常以触发回滚。
  6. 检查配置:确保Spring Boot和JPA的配置正确。

示例代码

// Configuration class
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
    // DataSource and TransactionManager beans
}

// Service class
@Service
public class MyService {

    @Autowired
    private AnotherService anotherService;

    public void nonTransactionalMethod() {
        anotherService.myTransactionalMethod();
    }
}

@Service
public class AnotherService {

    @Transactional
    public void myTransactionalMethod() {
        // Method logic
    }
}

通过确保以上因素正确配置和使用,可以避免@Transactional失效的问题,确保事务管理生效。

 

标签:回滚,Transactional,Spring,void,事务,public,注解,class
From: https://www.cnblogs.com/shendidi/p/18291142

相关文章

  • @ConditionalOnClass注解解析
    文章目录概要Bean注册过程@ConditionalOnClass注解总结概要springboot中各种@ConditionalXxx注解控制着Bean是否注册,只有满足了一定条件才会被注册到容器中。这些注解包含@ConditionalOnClass、@OnBeanCondition、@ConditionalOnProperty等等,这篇文章就和大家探究下......
  • 注解
    注解AnnotationAnnotation作用:不是程序本身,对程序作出解释(这一点和注释(comment)没什么区别)可以被其他程序(如:编译器)读取格式:注解是以"@注解名''在代码中存在的,还可以添加一些参数值,如:@SuppressWarings(value="unchecked")在哪里使用:可以附加在packa......
  • Spring的@Value注解和SpringBoot yml配置项目实战踩坑总结
    知识点Spring提供了@Value注解,可用于将配置文件或注册中心的属性值动态注入到Bean中。注:@Value注解在spring-beans包里。@Value("${...}"):注入获取对应属性文件中定义的属性值;@Value("#{...}"):表示SpEl表达式通常用来获取Bean的属性;实例/***服务内动态配置**@au......
  • 使用AOP和注解对DTO中的字段进行截断——第一次使用AOP和自定义注解的心得
    是骚操作,但是为了应对特殊的需求,实现了通过在方法上应用@TruncateString注解,进入AOP,获得第一个参数中的DTO,然后获取DTO中加了@LimitStringLength注解,将字段修改之后返回。#AOP中要注意的点:AOP由Spring管理,所以要生效的话需要加上@Component注解可以把注解绑定到一个方法上,然后......
  • 注解Annotation
    基本概念注解(Annotation)也叫做元数据,用于修饰包、类、方法、属性、构造器、局部变量等数据信息。和注释一样,注解不影响程序逻辑,但是注解可以被编译或运行,等同于嵌套在代码中的补充信息。在javaSE中,注解用于标记过时的功能,忽略警告等,在JavaEE中注解用于配置应用程序的任何切面,......
  • SpringBoot拦截器中获取注解、拦截器中注入Service
    拦截器中获取注解来源:https://blog.csdn.net/wangmx1993328/article/details/81030268/publicclassJWTInterceptorimplementsHandlerInterceptor{privateSysSettingServicesysSettingService;//构造函数传入ServicepublicJWTInterceptor(SysSettingServ......
  • 探案:其它配置|参数无错,罪魁祸首是它----使用lombok包Builder注解引起MyBatisSystemExce
    案件回顾:场景:实现某查询功能。详情具体如下:注意⚠️⚠️org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.executor.result.ResultMapException:Errorattemptingtogetcolumn'xxx'fromresultset.Cause:java.lang.NumberFormatExcept......
  • springboot使用注解方式打印方法日志
    springboot使用注解方式打印方法日志,可以很方便的打印日志,通用性很强。耦合很低,很好。作为程序员的我不废话,咱们直接上代码先创建个注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceShowLog{/***日志描......
  • SpringMVC中的注解配置
    目录13、注解配置springmvc13.1、创建初始化的类,代替web.xml13.2、使用流程声明一个类来继承AbstractAnnotationConfigDispatcherServletInitializer,并且实现他的抽象方法实现配置SpringConfig的java文件实现SpringMvcConfig的java文件13.3、实例代码1.继承AbstractAnnotationConf......
  • springboot-javax.validation编写自定义校验注解
    引入依赖:<!--jsr303--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency><!--hibernatevalidator--><depen......