首页 > 其他分享 >@Transactional 注解下,事务失效的七种场景

@Transactional 注解下,事务失效的七种场景

时间:2023-08-02 17:55:44浏览次数:36  
标签:deleteUser 七种 MyException userMapper throws deleteUserA void 注解 Transactional

1、异常被捕获后没有抛出

当异常被捕获后,并且没有再抛出,那么deleteUserA是不会回滚的

@Transactional
public void deleteUser() {
    userMapper.deleteUserA();
    try {
        int i = 1 / 0;
        userMapper.deleteUserB();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2、抛出非运行时异常

异步虽然抛出了,但是抛出的是非RuntimeException类型的异常,依旧不会生效。

@Transactional
public void deleteUser() throws MyException{
    userMapper.deleteUserA();
    try {
        int i = 1 / 0;
        userMapper.deleteUserB();
    } catch (Exception e) {
        throw new MyException();
    }
}

如果指定了回滚异常类型为Exception,那么就可以回滚非RuntimeException类型异常了。

@Transactional(rollbackFor = Exception.class)

3、方法内部直接调用

如果先调用deleteUser(),那么deleteUserA()是不会回滚的,其原因就是@Transactional根本没生成代理,如果直接调用deleteUser2()那么没问题,deleteUserA()会回滚。

public void deleteUser() throws MyException{
    deleteUser2();
}

@Transactional
public void deleteUser2() throws MyException{
    userMapper.deleteUserA();
    int i = 1 / 0;
    userMapper.deleteUserB();
}

修改方式,把当前类自己注入一下调用即可。

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
 //自己注入自己
    @Autowired
    UserService userService;

 public void deleteUser() throws MyException{
     userService.deleteUser2();
 }

 @Transactional
 public void deleteUser2() throws MyException{
     userMapper.deleteUserA();
     int i = 1 / 0;
     userMapper.deleteUserB();
 }
}


4、新开启一个线程

如下的方式deleteUserA()也不会回滚,因为spring实现事务的原理是通过ThreadLocal把数据库连接绑定到当前线程中,新开启一个线程获取到的连接就不是同一个了。

@Transactional
public void deleteUser() throws MyException{
    userMapper.deleteUserA();
 try {
  //休眠1秒,保证deleteUserA先执行
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    new Thread(() -> {
        int i = 1/0;
        userMapper.deleteUserB();
    }).start();    
}

5、注解到private方法上

idea直接会给出提示Methods annotated with ‘@Transactional’ must be overridable ,原理很简单,private修饰的方式,spring无法生成动态代理。

@Transactional
private void deleteUser() throws MyException{
    userMapper.deleteUserA();
    int i = 1/0;
    userMapper.deleteUserB();
}

6、数据库本身不支持

mysql数据库,必须设置数据库引擎为InnoDB。

 

标签:deleteUser,七种,MyException,userMapper,throws,deleteUserA,void,注解,Transactional
From: https://www.cnblogs.com/KL2016/p/17601378.html

相关文章

  • spring的事务注解详解
    Spring是一个流行的开发框架,它提供了很多功能和特性,其中包括事务管理。事务管理是在应用程序中执行一系列操作时,确保数据的一致性和完整性的关键方面之一。Spring框架提供了多种方式来管理事务,其中最常用的方式是使用注解。通过在方法或类级别上添加特定的注解,可以将相关的方法或类......
  • SpringDataJpa对拿到的对象进行set,但是不save,数据库也能自动更新,由于使用了注解 @Tran
    SpringDataJpa对拿到的对象进行set,但是不save,数据库也能自动更新,由于使用了注解@Transactional事务进行处理原文链接:https://blog.csdn.net/qq_19903753/article/details/103367252SpringDataJpa对拿到的对象进行set,但是不save,数据库也能自动更新概述今天在进行coderev......
  • Swagger_常用注解
            API的注解可以使测试是我们在测试接口里更好的分析......
  • 18_Spring_事务管理注解方式
    18_Spring_事务管理注解方式事务的管理应该放在我们的service层进行处理spring中有两种事务的管理方式1编程式事务管理(了解)2声明式事务管理(掌握)基于注解方式实现(掌握)XML方式实现(了解)Spring声明式事务的实现方式,底层就是AOP,AOP的底层就是动态代理Spring事务管......
  • 8_Spring_注解方式管理bean
    8_Spring_注解方式管理bean1注解方式创建对象IOC导入依赖aop@Component  放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中该注解有三个子注解@Controller 用于实例化controller层bean@Service    用于实例化service层bean@Repositor......
  • 12_Spring_AOP注解方式实现_掌握
    12_Spring_AOP注解方式实现_掌握AspectJ本身并不是spring框架中的组成部分,是一个独立的AOP框架,一般把AspectJ和Spring框架的AOP依赖一起使用,所以要导入一个独立的依赖实现的两种方式1基于注解方式实现(熟练)2基于XML配置方式(了解)准备工作1导入依赖<!-......
  • mybatis用注解如何实现模糊查询
    在MyBatis中使用注解实现模糊查询非常简单,只需要在相应的SQL语句中使用like关键字即可。以下是实现模糊查询的示例代码:@Select("SELECT*FROMusersWHEREnameLIKE'%${keyword}%'")List<User>findUsersByName(@Param("keyword")Stringkeyword);上述代码用@Selec......
  • 如何在 SAP Fiori Elements 应用的 manifest.json 里定义注解
    在SAPFioriElements应用中,manifest.json文件是应用的主要配置文件,其中定义了应用的元数据、模型、服务等信息。其中,dataSources区域负责描述应用使用的数据源,比如OData服务或者其他类型的后端服务。在dataSources区域的settings字段中,我们可以定义annotations,它们是......
  • @Conditional注解
    1.介绍@Conditional注解@Conditional注解源码@Conditionl注解简单说明@Conditional注解所属包org.springframework.context.annotation.Conditional注解作用范围{ElementType.TYPE,ElementType.METHOD}类、接口、注解、枚举以及方法注解生命周期@Retention(RetentionPolicy......
  • Spring,SpringMVC,Spring Boot中常见注解(持续更新)
    在学习Java框架时,注解的学习是必不可少的,这篇文章就来记录一下这些框架中的常用注解(常用注解)一,spring1.声明bean的注解@Component组件,没有明确的角色@Service在业务逻辑层使用(service层)@Repository在数据访问层使用(dao层)@Controller在展现层使用,控制器的声明......