小工具      在线工具  汉语词典  css  js  c++  java

注解事务不回滚 @Transactional

Java 额外说明

收录于:42天前

在我们的开发中,经常需要用到交易,比如转账等操作。这些我就不多说了,哈哈。

现在我来说一下Spring的声明式事务@Transaction的陷阱。我觉得最大的坑就是代理交易不生效的问题。我会在下面放一个链接以避免其他人询问。 https://blog.csdn.net/weixin_41485592/article/details/80031597

接下来我要讲的是另一个陷阱,这也是声明式事务不回滚的问题。重点来了。它来了。 。 。 。

@Transactional(rollbackFor = Exception.class) //一定要加 rollbackFor = Exception.class 参数,下面会说明原因:
如果你在写代码时候和我一样在类上或者在方法上加上@Transaction,就直接认为自己事务问题加好了。例如:

@Override
@Transactional
public void AddUserException() throws FileNotFoundException {}
这样的设置其实是存在问题的,之前我也是认为这样,我也想就这样他会默认添加传播属性什么的。下面我们实验看看有什么问题:

@Override
@Transactional
public void AddUserException() {
    SysUserEntity user=new SysUserEntity();
    user.setUniqueCode(UUIDGenerator.getUUID());
    user.setUsername("测试Exception");
    user.setPassword("我觉得我需要几个关注的粉丝哈哈。");
    user.setMobile("1095551903");
    sysUserDao.insert(user);
    int i=1/0;
}
实验结果:

将 / 抛零,事务回滚成功

再次实验:

@Override
@Transactional
public void AddUserException() throws FileNotFoundException {
    SysUserEntity user=new SysUserEntity();
    user.setUniqueCode(UUIDGenerator.getUUID());
    user.setUsername("测试Exception");
    user.setPassword("我觉得我需要几个关注的粉丝哈哈。");
    user.setMobile("1095551903");
    sysUserDao.insert(user);
    //int i=1/0;
    FileInputStream fis = new FileInputStream("D://a.txt");
}
实验结果:

抛出异常 java.io.FileNotFoundException 并且事务未回滚。

这时候,你的脑子里是不是有一句话?我之前写过吗? 。 。 ,哈哈哈哈,赶紧回去改代码吧。

事实上,这个问题并不总是遇到。这个问题就在于你没有捕获异常,直接抛出。如果你catch了try catch,然后抛出自定义异常之类的,就不会出现这个问题。

具体原因:当我们使用@Transaction时,默认是RuntimeException(即运行时异常),异常会被回滚。

让我们简单谈谈例外情况。异常分为检查异常和非检查异常(即运行时异常)。

IOException等检查异常,当你写代码时,编译器提示你必须尝试catch或抛出它,无论如何,它必须处理。

运行时异常是运行时产生的异常(有点废话,不过就是这个意思),比如/by零异常。

因此,当我们上面的实验抛出 java.io.FileNotFoundException 检查异常时,数据并没有回滚。

说了这么多,有点累了,就不再写了。之前没打算写demo,想直接表达出来。然后今天我突然发现我有粉丝了。哈哈哈哈,所以我写了一个demo。

解决方法。这样添加事务@Transactional(rollbackFor = Exception.class) 不管检查异常还是非检查异常都会回滚。如果感觉对你有用,算我没白忙活。一起同行。

原文:https://blog.csdn.net/weixin_41485592/article/details/80877665 
 

. . .

相关推荐

额外说明

自己实现一个strcopy(字符串复制)

1:源字符串必须以 '\0’结束 2:原字符串的 ‘\0’ 会拷贝到目标空间 3:目标空间必须够大才行 4:目标空间必须可变 #include <stdio.h> #include <assert.h> #include <string.h> void

额外说明

1466: 按出生日期排序(结构体专题)

1466: 按出生日期排序(结构体专题) Description 送人玫瑰手有余香,小明希望自己能带给他人快乐,于是小明在每个好友生日的时候发去一份生日祝福。小明希望将自己的通讯录按好友的生日排序排序,这样就查看起来方便多了,也避免错过好友的生日。为了小

额外说明

pip、conda找不到包skimage解决 换成scikit-image下载

报错 import skimage 报错 ModuleNotFoundError: No module named ‘skimage‘ 然后试图直接搜索skimage安装 conda环境 conda install skimage pip环境 pip

额外说明

docker部署grafana loki日志系统

Loki日志系统简介 Loki是 Grafana Labs 团队发布的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。 项目受 Prometheus 启发,官方的介绍就是:Like Prometheus, but for logs.,类似于

额外说明

写过的最蠢的代码

编程是一门艺术,也是一门科学。它可以让我们创造出令人惊叹的作品,也可以让我们陷入无尽的困境。在编程的过程中,我们难免会遇到一些错误、bug或者逻辑问题,有时候甚至会写出一些非常蠢的代码。今天,我就要分享一下我写过的最蠢的代码是什么。 这件事发生在我刚开始

额外说明

无心剑中译叶芝《凡事皆可诱惑我》

All Things Can Tempt Me 凡事皆可诱惑我 William Butler Yeats 威廉·巴特勒·叶芝 All things can tempt me from this craft of verse: One time it wa

额外说明

项目三:利用Spark RDD实现分组排行榜

文章目录 一、提出任务 二、完成任务 (一)新建Maven项目 (二)添加相关依赖和构建插件 (三)创建日志属性文件 (四)创建分组排行榜单例对象 (五)本地运行程序,查看结果 (六)交互式操作查看中间结果 1、读取成绩文件得到RDD 2、利用映射算子生

额外说明

深入学习 Java 序列化

前言 对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化的底层实现,这篇文章算是这次的学习小结吧。 第一部分:

额外说明

打开软件提示找不到mciole32.dll怎么办?

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mciole32.dll文件

ads via 小工具