返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot中@Transiactional注解没有效果的解决
  • 208
分享到

SpringBoot中@Transiactional注解没有效果的解决

2024-04-02 19:04:59 208人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot @Transiactional注解没有效果背景问题解决springBoot 使用Transaction注解遇到的坑一、场景二、Spring中使用的使用方式三

SpringBoot @Transiactional注解没有效果

背景

数据库Mysql

问题

使用SpringBoot操作数据库插入两条数据,service层的方法出现了异常,按理说两条数据都该插不进去的,可以数据库中却还是有一条数据。

数据库表格式:

这里写图片描述

service层代码:


package com.example.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.domain.Girl;
import com.example.demo.repository.GirlRepository;
@Service
public class GirlService {
    @Autowired
    private GirlRepository girlRepository;
    @Transactional
    public void transiactionTest() {
        Girl g1 = new Girl();
        g1.setAge(33);
        g1.setCupSize("B");
        girlRepository.save(g1);
        Girl g2 = new Girl();
        g2.setAge(33);
        g2.setCupSize("FFFFF");  // 长度和数据库的长度不符,会出异常
        girlRepository.save(g2);
    }
}

启动SpringBoot后,访问对应的方法,控制台也报错,但是表中是有一条数据的(原本是空表)。

这里写图片描述

查了查资料说的是在设计表的时候要选取的InnoDB引擎

回头看我的表引擎:

还真的是。。。。。。

解决

将数据表的引擎设置为InnoDB引擎。 然后再次执行,@Transitional注解才起了作用,数据表中没有了数据。

这里写图片描述

SpringBoot 使用Transaction注解遇到的坑

一、场景

开发一个多批次入库的功能,功能中涉及到多个表间的操作,对数据库表的操作要么同时成功,要么同时失败,不然就会存在脏数据,所以使用到了事务这个知识点()。

划重点:重要的都使用红色标出来了,大家如果不想看我废话,直接跳到红色字体即可0...0

二、Spring中使用的使用方式

1、使用传统的手动开始,手动提交事务即:beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。

2、使用Transaction注解的声明式事务,将事务的开启和提交交给Spring容器完成,这个也是本次我使用的方式,简单,但是使用时需要注意很多细节。

3、基于Spring aop的切面的事务配置(本人很少使用这个,所以本文不重点刨析该知识点,想了解的可以到其他博客进行查看)

三、使用中遇到的问题

1、使用Transaction注解时抛出异常但是事务不起作用,异常时事务没有进行回滚?

答:经过排查,查询在开启事务的方法中最外层使用了try...catch进行了异常的捕获,因此抛出的异常本捕获了,切面无法捕获到异常,所以不会进行回滚。

解决:

(1) 手动指定切面捕获的异常类型(因为默认情况下只会在RuntimeExceptionimeException情况下才会进行事务的回滚),方式:@Transaction(rollbcackFor=Exception.class)

(2) 在catch中手动抛出一个运行时异常即:throw new RuntimeException();

(3) 如果需要在事务回滚时,给调用当前方法的调用者返回错误信息的话,用第二种方案就是不行的,因为抛出异常后的语句时不会执行的,包括return后面的语句,所以,此时可以手动进行事务回滚的语句调用即:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

2、刚插入的数据,无法马上查询到?

答: 这个问题是个大坑,整整苦恼了我两天(可能是之前使用事务相关的知识比较少,所以遇到了根本就不知道是什么原因),因为项目中使用的是mybatisPlus框架,一开始便怀疑是框架的缓存问题,因为刚插入马上查询时,查询的sql语句并没有执行,即根本没到数据库去查,但是,手动关闭了缓存之后并没起效果,最后大佬看了代码后,一眼就指出问题所在(现在不得不感慨,经验时多么重要)。

要解决这个问题,首先要知道使用Transaction是怎么进行事务增强的,说白了,是通过生成代理对象进行切面注入的,当前对象并没有增强的作用,刚开始我插入和查询的方法都是写在一个service中,然后使用this调用这些方法,而this表示的是当前的service对象,所以这些方法根本就不在当前的事务中,因为刚插入的数据无法马上查询到0....0(我踩的大坑希望大家不要再踩了,太难受了..)

解决方法:说了这么多废话,现在知道问题产生的原因,所以就好解决了:

(1) 将所有的数据库操作方法抽取到另外一个Service对象中,然后通过@Autowire注入调用即可。

(2) 自己注入自己的对象即当前Service为A,可以直接使用:@Autowire private A a; 然后通过a调用相关数据库操作的方法(注意不要使用this,使用this的话无效),@Autowire private A a这句话实际上返回的是当前Service的代理对象,但特别需要注意的是:所有操作数据库相关的方法,访问权限都需改成public,不然会出现mapper和service注入为null---这个是个大坑,具体原因还不知道(这个方式推荐使用)

(3) 使用:((A) AopContext.currentProxy()).方法名()进行调用(听说这个方式在打包发布的时候会出现问题,本次没有试过这个方式,所以不推荐)

总结:

经验就是一个积累的过程,没有谁能够一步登天,所以脚踏实地才是成功的秘诀。本文只是本人在使用事务知识是遇到的问题的总结,希望能给大家一个参考,也希望大家多多支持编程网!

--结束END--

本文标题: SpringBoot中@Transiactional注解没有效果的解决

本文链接: https://lsjlt.com/news/133051.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot中@Transiactional注解没有效果的解决
    目录SpringBoot @Transiactional注解没有效果背景问题解决SpringBoot 使用Transaction注解遇到的坑一、场景二、Spring中使用的使用方式三...
    99+
    2024-04-02
  • 解决springboot中@DynamicUpdate注解无效的问题
    springboot 中 @DynamicUpdate 注解无效解决方案 遇到的问题 项目中使用 jpa,以前没用过,所以踩坑在所难免。 在使用过程中,要更新一条记录的某个字段,更新...
    99+
    2024-04-02
  • 如何解决css中margin-right没有效果的问题
    这篇文章主要讲解了“如何解决css中margin-right没有效果的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决css中margin-rig...
    99+
    2024-04-02
  • JPA默认值设置没有效果的解决
    目录问题:默认值设置没有效果解决办法JPA为字段设置默认值问题:默认值设置没有效果 springboot项目的JPA数据库表的类添加默认值,有2种方法 1、@Column(colu...
    99+
    2024-04-02
  • react引入css没有效果如何解决
    本文小编为大家详细介绍“react引入css没有效果如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“react引入css没有效果如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。react引入css没...
    99+
    2023-07-04
  • css导入成功但没有效果的解决方法
    这篇文章给大家分享的是有关css导入成功但没有效果的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。css导入成功但没有效果的解决办法:1、打开网页调试工具,根据显示错误进行修改;2、查看link标签的“r...
    99+
    2023-06-14
  • java SpringBoot注解@Async不生效的解决方法
    目录问题描述:解决方案:总结:SpringBoot 注解@Async不生效的解决方法 问题描述: 这里虽然加了@EnableAsync和@Async,但是异步请求依然没有生效 解决...
    99+
    2024-04-02
  • JPA默认值设置没有效果怎么解决
    这篇文章主要介绍“JPA默认值设置没有效果怎么解决”,在日常操作中,相信很多人在JPA默认值设置没有效果怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JPA默认值设置没有效果怎么解决”的疑惑有所帮助!...
    99+
    2023-06-25
  • java SpringBoot注解@Async不生效怎么解决
    这篇“java SpringBoot注解@Async不生效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“j...
    99+
    2023-06-29
  • idea导入springboot项目没有maven的解决
    目录idea导入springboot项目没有maven解决方案idea导入springboot项目出现的问题问题描述解决方案总结idea导入springboot项目没有maven 项...
    99+
    2023-05-17
    idea导入springboot项目 springboot项目没有maven idea springboot没有maven
  • wlan没有有效的ip配置如何解决
    这篇文章主要介绍了wlan没有有效的ip配置如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇wlan没有有效的ip配置如何解决文章都会有所收获,下面我们一起来看看吧。wlan没有有效的ip配置:首先点击左...
    99+
    2023-07-02
  • 如何解决SEM推广怎么做都没有效果的问题
    本篇内容介绍了“如何解决SEM推广怎么做都没有效果的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  第一、关键词较差  这个问题其实很...
    99+
    2023-06-13
  • springboot @PostConstruct无效的解决
    目录springboot@PostConstruct无效解决办法spring@PostConstruct的踩坑在springboot程序启动过程中出现一个问题springboot @...
    99+
    2024-04-02
  • SpringBoot中有哪些常用的注解
    这篇文章将为大家详细讲解有关SpringBoot中有哪些常用的注解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。@SpringBootApplication...
    99+
    2024-04-02
  • SpringBoot中常用的注解有哪些
    这篇文章主要介绍了SpringBoot中常用的注解有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、@SpringBootApplication此注解是Spring B...
    99+
    2023-06-21
  • idea中运行程序没有结果如何解决
    如果在IDE中运行程序没有结果,可能是由于以下几个原因导致的:1. 代码中存在错误:检查代码是否有语法错误或逻辑错误。IDE通常会标...
    99+
    2023-09-07
    idea
  • SpringBoot调用公共模块的自定义注解失效的解决
    目录调用公共模块的自定义注解失效项目结构如下解决方法SpringBoot注解不生效,踩坑解决方法调用公共模块的自定义注解失效 项目结构如下 我在 bi-common 公共模块里定义...
    99+
    2024-04-02
  • 电脑注册表中没有msahci选项如何解决
    本篇内容介绍了“电脑注册表中没有msahci选项如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在运行窗口中直接输入regedit后回...
    99+
    2023-06-27
  • VisualStodio2022中没有mysql.dll的解决办法
    背景: 想用C#连mysql,注意是mysql不是sqlserver,但是发觉引用不到mysql.dll和其他相应的dll。 原因: 官方问题,2019后只支持Oracle和SQLS...
    99+
    2024-04-02
  • 解决SpringBoot中使用@Transactional注解遇到的问题
    目录使用@Transactional注解遇到的问题1、不建议在接口上添加@Transactional注解2、@Transactional注解3、默认情况下4、数据库引擎需要支持事务管...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作