spring的事物控制

news2024/9/21 22:01:50

1.调用这个方法的对象是否是spring的代理对象($CGLIB结尾的)

2.这个方法是否是加了@Transactional注释

都符合才可以被事物控制

如果调用方法的对象没有被事物控制,那么被调用的方法即便是加了@Transactional也是没用的

一个非事务方法调同类一个事务方法,事务无法控制

举例如下:

在controller中,调用MediaFileServiceImpl 中的uploadFile方法,因为controller中注入了@Autowired MediaFileService mediaFileService;所以controller将被spring代理对象代理,此时如果MediaFileServiceImpl中的 uploadFile加了@Transactional注释,那么很自然的将受到事物控制。(验证是否是spring的代理对象,可以debug然后查看变量是否是$CGLIB结尾的)。

 如果在uploadFile方法上没有@Transactional注解,代理对象执行此方法前不进行事务控制,如下图:

 现在在addMediaFilesToDb方法上添加@Transactional注解,也不会进行事务是因为并不是通过代理对象执行的addMediaFilesToDb方法。为了判断在uploadFile方法中去调用addMediaFilesToDb方法是否是通过代理对象去调用,我们可以打断点跟踪。

 

controller代码如下,在try catch中看到用的是mediaFileService去调用的uploadFile方法,此时是可以控制事物的。

public class MediaFilesController {
    
@Autowired
MediaFileService mediaFileService;

@RequestMapping(value = "/upload/coursefile", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    public UploadFileResultDto upload(@RequestPart("filedata") MultipartFile filedata,
                                      @RequestParam(value = "folder",required=false) String folder,
                                      @RequestParam(value= "objectName",required=false) String objectName) {

        Long companyId = 1232141425L;
        UploadFileParamsDto uploadFileParamsDto = new UploadFileParamsDto();
        String contentType = filedata.getContentType();
        uploadFileParamsDto.setContentType(contentType);
        uploadFileParamsDto.setFileSize(filedata.getSize());//文件大小
        if (contentType.indexOf("image") >= 0) {
            //是个图片
            uploadFileParamsDto.setFileType("001001");
        } else {
            uploadFileParamsDto.setFileType("001003");
        }
        uploadFileParamsDto.setFilename(filedata.getOriginalFilename());//文件名称
        UploadFileResultDto uploadFileResultDto = null;
        try {
            uploadFileResultDto = mediaFileService.uploadFile(companyId, uploadFileParamsDto, filedata.getBytes(), folder, objectName);
        } catch (Exception e) {
            XueChengPlusException.cast("上传文件过程中出错");
        }

        return uploadFileResultDto;

    }

如果在uploadFile方法中取调用另外一个方法,那么显然调用的对象默认是this,并不是受到spring代理的对象,所以即便被uploadFile方法调用的方法加了@Transactional注释,也是没用的。

解决非代理对象调用@Transactional方法的:

我们可以模仿@Controller中的写法,在被调用的方法中注入相应的service,然后用service在非事物方法中取调用加了@Transactional注释的方法,这样事物是会生效的。

下面举例:

serviceimpl类中的uploadFile方法调用另一个@Transactional方法,形成事物

首先在serviceimpl中注入service对象:(对象名字无所谓,加了@Autowired注释的对象会被AOP拦截)

    @Autowired
    MediaFileService proxy;

调用方法:(在try代码第2行,用proxy调用)

@Override
    public UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, byte[] bytes, String folder, String objectName) {


       ....
        try {
            addMediaFilesToMinIO(bytes,bucket_files,objectName);
            MediaFiles mediaFiles = proxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);

            //准备返回数据
            UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();
            BeanUtils.copyProperties(mediaFiles,uploadFileResultDto);
            return uploadFileResultDto;


        } catch (Exception e) {
            log.debug("上传文件失败:{}",e.getMessage());
            throw new RuntimeException(e.getMessage());
        }

//        return null;
    }

被调用的方法:

@Transactional
public MediaFiles addMediaFilesToDb(Long companyId, String fileId, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName) {
    //保存到数据库
    MediaFiles mediaFiles = mediaFilesMapper.selectById(fileId);
    if(mediaFiles == null){
        mediaFiles = new MediaFiles();

        //封装数据
        BeanUtils.copyProperties(uploadFileParamsDto,mediaFiles);
        mediaFiles.setId(fileId);
        mediaFiles.setFileId(fileId);
        mediaFiles.setCompanyId(companyId);
        mediaFiles.setBucket(bucket);
        mediaFiles.setFilePath(objectName);
        mediaFiles.setUrl("/"+bucket+"/"+objectName);
        mediaFiles.setCreateDate(LocalDateTime.now());
        mediaFiles.setStatus("1");
        mediaFiles.setAuditStatus("002003");

        //插入文件表
        mediaFilesMapper.insert(mediaFiles);

    }
    return mediaFiles;

}

注意:我们这里由于是用的service来调用,而service是一个接口,所以被proxy调用的方法必须也是以接口形式呈现出来,那么需要将addMediaFilesToDb写入到对应调用这个方法的service(此处用)MediaFileService proxy调用,所以在MediaFileService 中加上这个方法,写个接口即可。

接口如下:

public interface MediaFileService {
/***
* @description 上传文件到数据库,抽取为接口的形式,方便调用
* @param companyId
 * @param fileId
 * @param uploadFileParamsDto
 * @param bucket
 * @param objectName
* @return
* @author
* @date
*/
 public MediaFiles addMediaFilesToDb(Long companyId, String fileId, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName);
}

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

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

相关文章

13.hadoop系列之MapReduce排序实践

本文我们学习MapReduce的全排序、二次排序以及区内排序 1.MapReduce概述 MapTask和ReduceTask均会对数据按照key进行排序。该操作属于hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要默认排序是按照字典顺序排序,通过快速排序…

【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

文章目录原题展示原题分析详细题解LED模块按键模块串口LCD模块模拟电压读取(ADC)脉冲输入输出文章福利原题展示 原题分析 本届国赛试题主要包含LCD、LED、按键、EEPROM、串口、模拟电压输入、脉冲输入输出七大部分,其中前面三个部分是蓝桥杯嵌入式的“亲儿子”(必考…

SpringBoot 集成 Kafka

SpringBoot 集成 Kafka1 安装 Kafka2 创建 Topic3 Java 创建 Topic4 SpringBoot 项目4.1 pom.xml4.2 application.yml4.3 KafkaApplication.java4.4 CustomizePartitioner.java4.5 KafkaInitialConfig.java4.6 SendMessageController.java5 测试1 安装 Kafka Docker 安装 Kafk…

数据库原理及应用期末复习汇总(附某高校期末真题试卷)

文章目录《数据库原理及应用》试题1一、选择题(共35分)二、填空(每空1分,共20分)三、T-SQL综合题(共35分)四、综合应用题(共10分)《数据库原理及应用》试题2一、选择题(共35分)二、填空&#xf…

handler解析(5)常见面试题

目录 1.请大致讲下handler的工作原理 2.handler.postDelay原理 3.一个线程有几个Looper?几个Handler? 4. Handler内存泄漏原因?以及解决方案 5.为何主线程可以new Handler如果想要在子线程中new Handler要做些什么准备? 6.消息退出是调…

R语言广义可加模型在空气环境污染方面的应用(1)

粉丝私信我希望复制一篇文章的图片,图片来源于文章:Wu C, Yan Y, Chen X, Gong J, Guo Y, Zhao Y, Yang N, Dai J, Zhang F, Xiang H. Short-term exposure to ambient air pollution and type 2 diabetes mortality: A population-based time series st…

中频采样和IQ采样的比较和转换

一、什么是中频采样,什么是IQ采样 射频接收系统通常使用数字信号处理算法进行信号解调和分析,因此需要使用ADC对信号进行采样。根据采样频率的不同,可以分为射频直接采样、中频采样、IQ采样。射频采样和中频采样只需要一路ADC,采…

搜索引擎ES相关问题

一、什么是倒排索引?有什么好处?索引: 从ID到内容。倒排索引: 从内容到ID。好处: 比较适合做关键字检索。 可以控制数据的总量。提高查询效率。搜索引擎为什么比MySQL查询快? lucence文章 -》 term ->排…

element-ui中el-table点击其他自定义按钮展开table中某一行

element-ui中el-table点击其他自定义按钮展开table中某一行 在日常开发中,我们遇见了会有点击某些按钮,使得表格行展开的需求,这时候去查看文档 element-ui(table) 这里官方提供了示例为在行最左侧有一个展开合并ico…

JAVA开发测试(jmeter如何测试性能与估算)

对C的业务网站或应用,进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具: Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能,是Apache组织开发的…

CCF-CSP真题《202212-1 现值计算》思路+python满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202212-1试题名称:现值计算时间限制:1.0s内存限制:512.0MB问题描述: 问题描述 评估一个长期项目的投资收益,资金的…

中点BH算法对任意斜率的直线扫描转换方法

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…

六“元”数智增长模型,企业元宇宙时代的经营新范式

摘要:在中国传统哲学里,“元”表示最基本的、最根本的东西;在企业管理经营中,将“元”解释为企业的核心竞争力或者基础能力;元宇宙下,“元”就代表数智化下的新场景,来支撑企业的各种业务创新。 一、元宇宙下的“元” …

分享IDEA通过插件 【一键自动生成】 在线api接口文档

开发写代码已经很辛苦,相信每个开发人员都不想写接口文档,但是不写又不行。尤其现在开发的项目偏向于前后端分离,在没有接口的情况下,前后端很难对接联调,测试也无法很好的测试。现在IDEA的插件仓库里有款插件&#xf…

qt 内存泄漏处理办法

windows 版本windows msvc版本可以使用vld检测可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号;可以得到泄露内存的完整数据;可以设置内存泄露报告的级别。缺点:1.只针对 Visual C &#xff08…

VUE -- defineExpose

defineExpose定义demo定义 defineExpose定义:用于组件通信中父级组件调用操作子组建方法和响应式属性参数能力 在使用definExpose前需要了解两个拷贝对象函数 对象copy:shallowReactive 与 数据 copy:shallowRef 这两个都是vue包里面的 简…

图片文字识别OCR调研-中文

直接看效果对比 tesseract-ocr 该识别引擎最新版本tesseract4添加了支持神经网络(LSTM)的,该引擎专注于线条识别, 同时也保留了Tesseract OCR 引擎,该引擎通过识别字符模式来工作。 我们需求端的后台语言是go&#x…

时尚高级实用,零跑C01满足各种用车需求

零跑C01在新能源车市场上销量可观且口碑较好,为什么消费者会相中这个国产车全域自主研发的新能源车呢?下面的介绍会给出答案。就其外观而言,零跑C01的外观定位于中大型轿车,在外观设计上充分考虑到美学观念。零跑给出了七个车身颜…

扬帆优配|日均客运量恢复,民航业加速复苏,外资买入2股超亿元

春运民航客运量康复至疫情前七成。 2月16日,民航局举行2月例行新闻发布会。会上介绍,自1月7日至2月15日,春运40天,民航运送旅客5523万人次,日均客运量138万人次,同比去年春运添加39%,康复至2019…

Lesson5.1---Python 之 NumPy 简介和创建数组

一、NumPy 简介 NumPy(Numerical Python)是 Python 的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比 Python 自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示…