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

news2025/2/24 20:07:21

文章目录

    • 1、异常被捕获后没有抛出
    • 2、抛出非运行时异常
    • 3、方法内部直接调用
    • 4、新开启一个线程
    • 5、注解到private方法上
    • 6、数据库本身不支持
    • 7、事务传播属性设置错误

图片

@Transactional是一种基于注解管理事务的方式,spring通过动态代理的方式为目标方法实现事务管理的增强。

@Transactional使用起来方便,但也需要注意引起@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。

7、事务传播属性设置错误

注意传播属性的设置,比如设置了:PROPAGATION_NOT_SUPPORIED(以非事务的方式执行,如果当前有事务则把当前事务挂起)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云服务器镜像操作系统大全_Linux_Windows清单

腾讯云CVM服务器的公共镜像是由腾讯云官方提供的镜像,公共镜像包含基础操作系统和腾讯云提供的初始化组件,公共镜像分为Windows和Linux两大类操作系统,如TencentOS Server、Windows Server、OpenCloudOS、CentOS Stream、CentOS、Ubuntu、Deb…

Python基础小项目

今天给大家写一期特别基础的Python小项目,欢迎大家支持,并给出自己的完善修改 (因为我写的都是很基础的,运行速率不是很好的 目录 1. 地铁票价题目程序源码运行截图 2. 购物车题目程序源码运行截图 3. 名片管理器题目程序源码运行…

应用程序运行报错:First section must be [net] or [network]:No such file or directory

应用程序报错环境: 在linux下,调用darknet训练的模型,报错:First section must be [net] or [network]:No such file or directory,并提示:"./src/utils.c:256: error: Assertion 0 failed." 如…

GAMES101:作业1记录

主要记录一下GAMES101作业的记录和思考。 1 总览2. 代码编写get_model_matrix(float rotation_angle)get_projection_matrix(float eye_fov,float aspect_ratio,float zNear,f1 oat zFar)进阶代码 Eigen::Matrix4f get_model_matrix_anyaxis(Vector3f axis, float angle) 3. 其…

如何学习嵌入式软件开发?

首先就是认知和基础阶段的学习。这部分一般都是要求学习一些行业认知类的课程,指导嵌入式未来的发展前景和就业趋势,C语言的入门,开发工具的使用,常见的命令,数据结构算法等内容。这一部分主要的就是要靠记忆力&#x…

odoo-034 float 浮点数比较

文章目录 前提问题解决总结 前提 odoo 版本:13 python:3.6.9 问题 比较销售订单行中已送货跟已开票,在 tree 视图显示搜索后的结果。发现搜索条件为已送货 > 已开票时,结果中会包含已送货已开票的。 解决 把这两个值打印出…

【ARM 调试】如何从 crash 信息找出问题原因

一、问题背景 粉丝在进行 ARM-A 系列软件编程时遇到以下问题,串口打印这段日志后就重启了,粉丝求助问是什么原因? Unhandled Exception in EL3. x30 0x0000000000b99b84 x0 0x00000000179a25b0 x1 …

【LeetCode】1572.矩阵对角线元素的和

题目 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出:25 解释:对角线的和为&a…

『向阳花赠书活动 | 第一期』《互联网广告系统:架构、算法与智能化》

大家好,我是向阳花,数据科学路上,与你同行。🚀 个人主页:向阳花个人主页 声明:赠书活动是博主与出版社达成合作,为粉丝专属福利,免费参与,非粉丝中奖不算! 『…

Server - WandB 统计运行 Epoch 以及 手动上传日志

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132227253 WandB (Weights & Biases) 是在线的模型训练可视化工具,可以帮助跟踪机器学习项目,记录运行中的超参数和输…

yum仓库简介

yum仓库网络服务 一.yum仓库简介二.yum配置文件2.1yum主配置文件2.2仓库设置2.3日志文件 三.yum命令详解3.1查询软件包命令3.2查询软件包组命令3.3yum安装升级3.4软件卸载 四.搭建yum仓库4.1 http方式搭建仓库 一.yum仓库简介 yum是基于RPM包构建的软件更新机制,能够…

从初学者到专家:Java运算符的完整指南

目录 1.算数运算符 2.增量运算符 2.1自增/自减运算符 4. 逻辑运算符 5.位运算符 6.移位运算符 7. 条件运算符 导言: Java作为一门广泛使用的编程语言,其运算符是编写代码时必不可少的一部分。本篇博客将为你详细介绍Java中的各种运算符&#xf…

【AndV】ant-design-vue中select使用mode=“combobox“无效:

文章目录 一、问题:二、解决: 一、问题: Warning: [antdv: Select] The combobox mode of Select is deprecated,it will be removed in next major version,please use AutoComplete instead 二、解决: 将mode"combobox"改为mode"SECRET_COMBOBOX_MODE_DO_NOT_…

Docker启动一个Centos镜像

搜索可用的centos的docker镜像 docker search <image>&#xff1a;在docker index中搜索imagedocker search centos 下载centos镜像&#xff08;拉取镜像&#xff09; docker pull centos:latest查看镜像docker images&#xff1a;列出imagesdocker images -a&#xff…

Paddle OCR V4 测试Demo

效果 项目 VS2022.net4.8OCRV4 代码 using OpenCvSharp; using Sdcb.PaddleInference; using Sdcb.PaddleOCR; using Sdcb.PaddleOCR.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; usin…

java连接sqlserver细节处理

这个文章记录一下java连接sqlserver细节处理 &#xff0c;有其他的细节可以评论。 首先是 驱动 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverpom文件 将mysql的改成这个 <!-- 数据库驱动 --><dependency><groupId>com.microsoft.sqlserve…

iOS字体像素与磅的对应关系

注意&#xff1a;低于iOS10的系统&#xff0c;显示的字宽和字高比高于iOS10的系统小。 这就是iOS10系统发布时&#xff0c;很多app显示的内容后面出现…&#xff0c;因而出现很多app为了适配iOS10系统而重新发布新版本。 用PS设计的iOS效果图中&#xff0c;字体是以像素&#x…

2023年大数据与计算国际会议 (WBDC 2023)| EI、Scoups检索

会议简介 Brief Introduction 2023年大数据与计算国际会议&#xff08;WBDC 2023&#xff09; 会议时间&#xff1a;2023年11月17 -19日 召开地点&#xff1a;中国西安 大会官网&#xff1a;www.iwbdc.org 2023年大数据与计算国际会议&#xff08;WBDC 2023&#xff09;将围绕“…

PostgreSQL中根据时间段范围查询数据,如19:29:10到20:29:10范围内的数据,排除年月日

数据格式如下 问题描述 我的SQL语句条件是 WHERE (TO_CHAR(cti.binder_gen_time, YYYY-MM-DD HH:mm:ss) > 19:29:10 AND TO_CHAR(cti.binder_gen_time, YYYY-MM-DD HH:mm:ss) < 20:29:10)为什么我数据的时间是2023-07-20 17:58:29也能被查出来&#xff1f; 问题解决…

Centos7.9系统_亲测成功_磁盘满了_分区和挂载新盘_创建文件夹并挂载分区---Linux工作笔记057

由于在某些部署环境下,运维管理员,仅仅是给分配一些硬盘容量,但是并没有进行分区和挂载到对应的合适的目录下,因此这个时候就需要我们自己去处理了. 这个是自己亲测成功的:由于是后面记录的,尽量记录详细 free -h 查看一下内存情况 df -h查看 硬盘的使用情况,还有是否有没挂载…