小心 MybatisPlus 的一个坑

news2024/11/24 18:45:52

小心 MybatisPlus 的一个坑

昨天测试说有个 xx 功能用不了,扔给我一个截图,说有报错:

在这里插入图片描述
报错信息就是:Transaction rolled back because it has been marked as rollback-only,很好理解:事务被回滚了,因为它已经被标记了只能回滚。

我一看巧了,这不就是我之前分析过的面试题吗!
在这里插入图片描述
之前的文章我解释过:这种错一般发生在嵌套事务中,即内层事务出错,但是由于是否提交事务的操作由外层事务触发,于是乎内层事务只能做个标记,来设置当前事务只能回滚。

紧接着它想抛出错误,但是由于被 try catch 了,于是乎正常执行后续的逻辑,等执行到最后,外层要提交事务了,发现当前事务已经被打了回滚的标记,所以提交失败,报了上面的错。

具体原理可以看我之前的那篇文章,这里简单举例下会出错的示例代码:

大致就是下面这个代码调用逻辑,有一个 service 标记了 @Transcational,采用默认的事务传播机制:


@Service
public class AddressService {

@Autowired
AddressMapper addressMapper:

@Transactional(rollbackFor = Exception.class)
public void errorInvoker(Address address){
     addressMapper.insert(address) ;
}

}

紧接着 UserService#insert 调用了 addressService#errorInvoker,这个方法也标记了 @Transcational:


@Service
public class UserService {

@Autowired
UserMapper userMapper;

@Autowired
AddressService addressService:

@Transactional(rolbackFor = Exception.class)
public void insert(User user){
	try {
	     addressService.errorInvoker(new Address(1, "aaaa"') )
	} catch (Exception e) {
	      e.printStackTrace() ;
	}
	     userMapper.insert(user);
  }
}

这样一来,只要 addressService#errorInvoker 的调用发生报错,那么必然能重现上面的报错信息。

使用嵌套事务报错事例二:

大致的代码如下:

@Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean xxx(xxx dto) {
        list1 = .....;
        try {
              数据库批量保存list1;
        } catch (Exception e) {
            if (e instanceof DuplicateKeyException) {
                //筛选过滤重复 key 的数据
                //打标发送
                数据库批量保存过滤之后的list1;
            }
            ....
        }
        sendToMQ(xxx);
        list2 = .....;
        try {
             数据库批量保存list2;
        } catch (Exception e) {
            if (e instanceof DuplicateKeyException) {
                //筛选过滤重复 key 的数据
                //打标发送
                数据库批量保存过滤之后的list2;
            }
            ...
        }
        sendToMQ(xxx);
        return Boolean.TRUE;
    }

这里的代码逻辑不复杂,明面上来看,我并没有调用别的 service !也并不存在嵌套事务的问题,所以我思来想去也看不明白。

看 try-catch,但是 try 里面就是一个 mybatis-plus 的 IService,批量保存数据的操作。

难道它有什么骚操作?点进去一看突然发现:
在这里插入图片描述
mybatis-plus 为了保证批量保存的事务性,加了 @Transactional。

合着我确实没想着使用嵌套事务,但是这被迫上了“贼船”啊!

这本是好意,但是在我这个场景有点麻,它完美的复现了上文提到的那个错误使用,在有重复 key 的场景确实报错了,但是被外层 try-catch 拦住了抛错,不过事务上已经打了失败的标了!

解决办法其实很简单:

把 saveBatch 上的 @Transactional 注解删了,很明显我做不到,这是 mybatisplus 的源码。
把 saveBatch 上的 @Transactional 注解上设置事务传播机制为:REQUIRES_NEW 或 NESTED,很明显,我也做不到,这是 mybatis-plus 的源码。

然后我找了下,好像也没有什么参数可以指定 saveBatch 的事务传播机制。

所以咋办。。。测试还在催我,没办法,只能不用 mybatis-plus 的 saveBatch ,自己通过 mapper 写个批量插入了:
在这里插入图片描述
一波操作提交代码重启服务,让测试再试试,且轻飘飘的甩一句:这不是我的bug,我被框架坑了。

咳咳,反正我不管,我的代码没有bug,这是程序员最后的倔强。

所以在使用三方代码的情况下还是需要多留个心眼点点看。

我记得以前还听说过一个段子,就是有个人用了一个网上的组件,正常情况下都没事,异常情况下,系统就挂了。

后面一找,那个组件在个角落嘎达写了 System.exit。

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

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

相关文章

【Qt QML入门】Text

Text组件在场景中添加格式化文本, 提供的是只读文本。文本项可以显示纯文本和富文本。Text {id: txttext: "Hello World!"font.family: "Helvetica"font.pointSize: 24color: "red" } 也可以支持部分Html格式标签 Text {id: txt1font.pointSize…

python_day6_异常与包机制

异常 try:可能出现异常的代码 except:若出现异常执行的代码 try:f open("D:/linux.txt", "r", encoding"utf-8")f.readlines() except:print("出现异常了,文件不存在,更换模式w")# f open("D:/linux.txt…

欧姆龙以太网口怎么和电脑连接

捷米特JM-ETH-CP以太网通讯处理器用于欧姆龙 CP1L/ CP1E/ CP1H 系列 PLC 的以太网数据采集,捷米特JM-ETH-CP以太网模块不占用 PLC 通讯口,即编程软件/上位机软件通过以太网对 PLC 数据监控的同时,触摸屏可以通过复用接口与 PLC 进行通讯。支持…

【国密】SM3密码杂凑算法(附源码分析)

一、前言 SM3 算法是中国国家密码管理局于 2010 年发布的一种密码杂凑算法,广泛地应用于数据的完整性校验、数字签名、消息认证码、密钥交换和数据加密等。密码杂凑算法需要满足三种基本属性:抗原像攻击、抗第二原像攻击、抗碰撞攻击,这三种…

【动手学习深度学习--逐行代码解析合集】14多输入多输出通道

【动手学习深度学习】逐行代码解析合集 14多输入多输出通道 视频链接:动手学习深度学习–多输入多输出通道 课程主页:https://courses.d2l.ai/zh-v2/ 教材:https://zh-v2.d2l.ai/ 1、多输入通道 import torch from d2l import torch as d2l …

[C语言][小游戏][猜拳游戏]

C语言的奇妙旅行 一、模块化编程二、游戏基本设计2.1 确定计算机要出的手势2.2 显示“石头剪刀布”,然后玩家输入自己要出的手势2.3进行输赢判断,显示结果2.4询问是否继续2.5 基本程序 三、游戏实现的过程3.1将玩家的手势和电脑的手势显示出来 三、总代码…

复习java基础

复习一天有点忘了的知识: 结构化编程 结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。 指导思想 自顶向下、逐步求精、模块化 编程过程 流程图是…

CVPR 2023 | OVSeg: Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP

CVPR 2023 | OVSeg: Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP 论文:https://arxiv.org/abs/2210.04150代码:https://github.com/facebookresearch/ov-seg 架构设计 类别无关的 mask proposal generator:MaskFormer手动…

linux端口被占用 关闭端口

1.查看端口是否被占用 netstat -anp |grep [端口号]2.查看占用的进程 lsof -i:[端口号]3.关闭进程 kill -9 [进程PID]LISTEN 表示被占用,3061/java 分别是:进程PID/进程 通过进程PID关闭进程

桥接模式:解耦抽象与实现

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。本文将深入探讨桥接模式的原理、结构和使用方法,并通过详细的 Java 示例代码来说明。 1. 桥接模式的定义 桥接模式是一种将抽象部分与实现部分分离的设计模…

数字信号处理复习知识点

目录 第一章:时域离散系统 1.什么是因果性和稳定性 2.模拟频率,模拟角频率, 数字频率之间的关系 3.什么是频谱混叠? 第二章:时域离散信号和系统的频域分析 1.时域离散信号傅立叶变换的定义 2.如何用模拟信号的傅立…

电信青年员工踏上三千里数字化追梦之旅,数字员工为电信高质量发展注智赋能

导语: 近年来,广西电信紧紧围绕集团战略,聚焦产业数字化发展机遇,加强前瞻性技术研究和人工智能产业应用研究,为夯实高质量发展增添科技动力。 在数字中国建设的大背景下,广西电信全资子公司广西壮族自治区…

推荐一款适合前端宝宝体质的数据库文档工具

先看效果 首页 安心食用 npx dbshowlatest按照提示输入相关信息 Welcome to the DB Show! v0.0.7? Use config from local? no ? Select a database type MySQL ? Enter the host name localhost ? Enter the port number 3306 ? Enter the user name root ? Ente…

Linux slab 分配器源码解析

文章目录 前言一、slab分配器1.1 简介1.2 高速缓存描述符1.3 架构图 二、相关结构体2.1 struct array_cache2.2 struct kmem_list32.3 struct slab2.3.1 简介2.3.2 OFF_SLAB 三、创建和释放slab3.1 创建slab3.1.1 kmem_getpages3.1.2 alloc_slabmgmt3.1.3 slab_map_pages 3.2 释…

常用数据分类算法原理介绍、优缺点分析与代码实现[LR/RF/DT/SVM/NavieBayes/GBDT/XGBoost/DNN/LightGBM等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据分类算法,对其原理简单总结记录,同时分析对应的优缺点,以后需要的时候可以直接翻看,避免每次都要查询浪费时间,欢迎补充。 机器学习领域中常用的分类模型包括以…

分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)

目录 分布式事物解决方案_XA方案 分布式事物解决方案_Seata实现 Seata提供XA模式实现分布式事务_业务说明 Seata提供XA模式实现分布式事务_下载启动Seata服务 Seata提供XA模式实现分布式事务_搭建聚合父工程构建 创建工程distribute-transaction 字符编码 注解生效激活 Jav…

three js模型旋转

如何让立方体模型旋转到指定的面 父页面 <b-modal ref"modal_mini" size"lg" centered static :hide-footer"true":dialog-class"[modal_mini]":content-class"position-static":body-class"p-0":header-class…

上海亚商投顾:沪指放量调整 两市超4000只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡调整&#xff0c;深成指、创业板指午后跌超1%。AI概念股集体下挫&#xff0c;CPO、算力等方向领跌&am…

感知网络安全态势是什么?感知网络安全态势如何实施

网络安全是当今社会中一个非常重要的话题。随着互联网的普及和信息技术的发展&#xff0c;网络安全问题日益突出。为了有效应对各种网络威胁和攻击&#xff0c;网络安全态势感知成为了一种关键的技术手段。 网络安全态势感知的定义 网络安全态势感知是指通过对网络环境中的各种…

2023-07-11力扣每日一题

链接&#xff1a; https://leetcode.cn/problems/maximum-alternating-subsequence-sum/ 题意&#xff1a; 给定一个数组&#xff0c;求一个子序列&#xff0c;使这个子序列的奇数位和-偶数位和最大&#xff08;下标从1开始的话|反正第一个数是&#xff09; 解&#xff1a;…