首页 > 其他分享 >@Transitional注解失效场景

@Transitional注解失效场景

时间:2024-08-25 10:50:42浏览次数:10  
标签:Exception Transitional Transactional insertUser class user 失效 注解 public

 @Transitional注解用于完成声明式事务操作,默认当发生RuntimeException时会对当前事务操作进行回滚,但其使用不当就会造成失效;

场景一:抛出异常非RuntimeException

@Transitional
public void insert() throws Exception {

    // insert...
    throw new Exception();
}

解决方案

        手动设置事务回滚捕获的异常 

@Transitional(rollBackFor = Exception.class)
public void insert() throws Exception {
    // insert...
    throw new Exception();
}

场景二:方法类中自调用

被@Transactional注解的方法在类中自调用,是通过this对象进行的,而不是通过Cglib的代理对象调用,因此并没有被Spring事务处理器管理,从而导致事务失效。

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    publicvoid test1() {
        insertUser();
    }

    @Transactional(rollbackFor = Exception.class)
    public void insertUser() {
        User user = new User();
        userMapper.insert(user);
    }
}

解决方案:

        1、将@Transactional注解到外层方法

        2、如果业务避不开自调用,那么就自己注入自己,再进行调用;

方案一:
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional(rollbackFor = Exception.class)
    publicvoid test1() {
        insertUser();
    }

    public void insertUser() {
        User user = new User();
        userMapper.insert(user);
    }
}

方案二:
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private UserService userService;

    publicvoid test1() {
        userService.insertUser();
    }
    
    @Transactional(rollbackFor = Exception.class)
    public void insertUser() {
        User user = new User();
        userMapper.insert(user);
    }
}

场景三:异常被捕获

异常被捕获后,没用继续抛出,导致Spring事务管理器没有捕捉到异常,其认为是正常业务逻辑,因而不会回滚。

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional(rollbackFor = Exception.class)
    public void test1() {
        try {
            insertUser();
        } catch (Exception e) {
            System.out.println("测试解决异常");
        }
    }

    public void insertUser() throws Exception {
        User user = new User();
        user.setId(UUID.randomUUID().toString().replaceAll("-", ""));
        user.setName(UUID.randomUUID().toString().replaceAll("-", ""));
        userMapper.insert(user);
        throw new Exception("test Exception");
    }
}

解决方案

        捕获解决后继续抛出。

@Transactional(rollbackFor = Exception.class)
public void test1() throws Exception {
    try {
        insertUser();
    } catch (Exception e) {
        System.out.println("测试解决异常");
        throw e;
    }
}

其他场景

1、数据库引擎不支持事务,例如Mysql的MyIsam

2、@Transactional注解方法所在类未被Spring容器管理(未使用@Service等注解,取而代之使用new对象调用方法);

3、事务方法中存在异步业务,异步处理部分发生异常,不会使得主方法回滚。

        多线程事务处理可以参考文章:Spring在多线程环境下如何确保事务一致性icon-default.png?t=N7T8https://blog.csdn.net/m0_53157173/article/details/127423286
4、更多场景可查看:啪!啪!@Transactional 注解的12种失效场景,这坑我踩个遍-腾讯云开发者社区-腾讯云 (tencent.com)

标签:Exception,Transitional,Transactional,insertUser,class,user,失效,注解,public
From: https://blog.csdn.net/w_0_1_/article/details/141497949

相关文章

  • 【Spring Boot进阶】掌握Spring Boot框架核心注解:从入门到精通(实战指南)
    文章目录SpringBoot注解大全:深入理解与实践引言第一部分:基础知识1.SpringBoot和Java注解简介2.SpringBoot项目搭建第二部分:核心注解详解3.@SpringBootApplication4.@Component,@Service,@Repository,@Controller,@RestController5.@Autowired6.@Bean7......
  • 【Spring进阶】掌握Spring MVC框架核心注解:从基础到实战应用(实战指南)
    文章目录SpringMVC常用注解详解及实践引言第一部分:SpringMVC基础回顾第1章:SpringMVC概述第2章:MVC模式与SpringMVC第3章:快速上手SpringMVC第二部分:核心控制器注解第4章:@Controller第5章:@RestController第6章:@RequestMapping第三部分:请求处理注解第7章:@RequestParam......
  • Spring系列之Spring Cache缓存注解的使用
    目录一、概述二、缓存注解1、@Cacheable缓存结果2、@CachePut更新缓存3、@CacheEvict 清除缓存4、@Caching组合缓存(不常用)5、@CacheConfig类级别缓存配置(不常用)6、@CacheResult设置缓存超时(不常用)三、使用方式1、@EnableCaching开启缓存2、在方法上添加注解@C......
  • el-upload重复上传文件失效(Element-Plus)
    当指定了参数limit=1,再次上传就会无效以下是官方文档给出的解决方法示例通过on-exceed来定义超出限制时的行为<template><el-uploadref="uploadRef":limit="1":on-exceed="handleExceed":auto-upload="false"></el-upload>......
  • dubbo[3]_注解配置
    本文介绍注解方式配置dubbo的例子。服务提供Provider1.定义接口Animal和实现类CatAnimal:publicinterfaceAnimal{/***描述:返回动物的叫声*/Stringsound();}Cat:packagecom.yt.provider;importcom.alibaba.dubbo.config.annotation.Ser......
  • springboot[2]_常用注解
    介绍一些常用注解。springBoot因为很少用到xml来配置bean文件,所以大部分都是用注解来创建和管理相关bean。@Component、@Service、@Repository和@Controller这几个注解效果都是差不多的,都是可以用来创建bean实例的。只是规定使用的方法不同而已。1.@Component自动被compo......
  • 求一命题,一注解,一翻译
    古有一妇,江海溺水。三男子过之:一拜,一遮衣,一立冢。 二世显为人,于世相逢,三男子差时遇:一识,一挚友,一百年。 前世知乎?今遇蔡氏娇娘,吾亦念百年缘也,日省己身,以时间为媒,与汝始于初见止于终老,生生世世,不悔不怨也,遂,焉知己非前世之偿也? —— 作者:张海清......
  • @Mapper,@Repository,@MapperScan注解对比
    1.@Repository@Repository是标注在Dao层接口上的,作用是将接口的一个实现类交给Spring管理。但是它需要配合@MapperScan进行使用,把@MapperScan("Mapper接口层路径")添加到启动类,系统会扫描持久层创建实现类并交给spring管理。2.@Mapper@Mapper也是使用在Dao层接口上的,使用它后就......
  • Element Plus表单调用resetFields方法失效
    问题描述:你会发现在第一次点击新增按钮的时候然后再点击编辑按钮,再点击新增按钮表单是可以正常清空的。但是如果你第一次点击编辑按钮,表单数据回显,关闭窗口再点击新增按钮发现编辑的数据竟然还在,就很玄乎。而且,你点击编辑其他数据再点击新增按钮发现竟然是第一次点击编辑的数据!......
  • Java SuppressWarnings 注解抑制警告参数记录
    在Java代码中可以通过合理使用@SuppressWarnings注解可以抑制一些不合适的警告,这里记录一下用过的忽略类型参数作用all抑制“可替换为Lambda表达式”的警告Convert2Lambda抑制“可替换为Lambda表达式”的警告unused抑制“方法/字段/属性等从未使用”的警告c......