Java每日面试题(事务相关)(day5)

news2024/9/21 20:36:58

目录

  • 什么是事务?
  • spring事务的实现方式
  • 事务失效的8种情况

什么是事务?


事务是一个操作序列,要么全部执行成功,要么全部执行失败。事务有四个重要特性,称为 ACID 特性:

  • Atomicity(原子性):事务中的所有操作要么全部完成,要么全部不完成。
  • Consistency(一致性):事务完成后,数据要处于一致的状态。
  • Isolation(隔离性):一个事务的执行不能被其他事务干扰。
  • Durability(持久性):事务完成后,数据应该永久保存

spring事务的实现方式


事务就是一系列的操作原子执行。Spring事务机制主要包括声明式事务和编程式事务。

  • 编程式事务:通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
  • 声明式事务:将事务管理代码从业务方法中分离出来,通过aop进行封装。Spring声明式事务使得我们无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。使用 @Transactional 注解开启声明式事务。

事务失效的8种情况


  1. public修饰的方法
    @Transactional 注解只能在在public修饰的方法下使用。

  2. 自调用(Self-Invocation)
    自调用指的是一个类的方法在调用同一个类的另一个方法,事务管理会失效。

    类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B。 自己调用自己

    @Service
    public class Demo {
    
      public void A() {
    
        this.B();
      }
      
      @Transactional
      public void B() {
         ......
      }
    }
    
    

解决方法:

解决方法是将这些方法拆分到不同的类中,或者通过 Spring 的代理来调用这些方法。

在该Service类中使用AopContext.currentProxy()获取代理对象

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableTransactionManagement
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

通过调用代理对象中被增强过的方法实现事务

((ServiceA)AopContext.currentProxy()).doSave(user);

或者
配置代理

  1. 数据库不支持事务
    MySQL中,MyISAM引擎不支持事物,InnoDB 支持事物

  2. 异常类型不匹配
    @Transactional 注解默认只管理运行时异常(如RuntimeException及其子类)和错误(如Error)。

    当抛出未被捕获的运行时异常时,Spring 会触发事务回滚操作,将之前的操作撤销;对于受检异常(即必须被捕获或声明抛出的异常,例如IOException,SQLException等),除非你明确配置事务管理器去处理它们,否则事务不会回滚。
    可以通过 rollbackFornoRollbackFor 属性来指定需要回滚或不需要回滚的异常类型。

  3. 传播属性设置问题
    传播属性
    propagation属性错误
    @Transactional 默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTEDNEVER事务传播机制,则事物不生效,如:

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    
  4. 捕获异常未抛出

    //自己消化掉了异常
    @Transactional
    public void A(){
    	try{
    	   ......
    	}catch(Exception e){
    	   // 未抛异常
    	}
    }
    
  5. Bean没有纳入Spring IOC容器管理
    使用spring事务的前提是:对象要被spring管理,需要创建bean实例。如果类没有加@Controller@Service@Component@Repository等注解,即该类没有交给spring去管理,那么它的方法也不会生成事务。

    // 注释调@Component,该类没被Spring管理,事物也是不生效的
    public class Demo {
      
      @Transactional(rollbackFor = Exception.class)
      public void A() {
         ......
      }
    }
    
  6. 事务方法内启动新线程进行异步操作
    主线程没有拿到子线程的异常,所以代理类以为正常执行了

     @Transactional()
        public int transfer2(String from,String to, int money){
            accountDao.decrMoney(from,money);
    
            new Thread(()->{
                int c = 5/0;
                accountDao.addMoney(to,money);
            }).start();
            return 1;
        }
    

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

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

相关文章

从教学到分享,2024精选录屏工具

如果你在公司里承担会议记录的职责,那录屏这项技能你一定要学会。像录屏大师这样的工具可以帮你在远程会议中进行录屏操作,方便你后期整理会议内容。 1.福昕录屏大师 链接直达:https://www.foxitsoftware.cn/REC/ 这款录屏工具提供了多种…

自定义线程池(二)

上节回顾 在上一节当中,已经实现了一个线程池,在本节当中,我们需要添加拒绝策略。这里使用到了策略模式的设计模式,因为拒绝策略是多种的,我们需要将这个权利下放给调用者(由调用者来指定我要采取哪种策略…

代码随想录算法训练营第41天|LeetCode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

1. LeetCode 121. 买卖股票的最佳时机 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 文章链接:https://programmercarl.com/0121.买卖股票的最佳时机.html#思路 视频链接:https://www.bilibili.com/…

微调基模型

该示例用的谷歌的gemma-2b-it模型 Gemma是Google的一系列轻量级、最先进的开源模型,基于用于创建Gemini模型的相同研究和技术构建。它们是文本到文本、仅解码的大型语言模型,提供英文、开源权重、预训练变体和指令调优变体。Gemma模型非常适合各种文本生…

微软蓝屏事件:网络安全与系统稳定性的深刻反思

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 写在前面 在数字化时代,软件更新已成为…

电测量数据交换DLMS∕COSEM组件第61部分:对象标识系统(OBIS)(下)

GB/T 17215.6的本部分规定了对象标识系统(OBIS)的总体结构并将测量设备中的所有常用数据项映射到其标识代码。OBIS为测量设备中的所有数据都提供唯一的标识符,不仅包括测量值,而且还包括仪表设备的配置或获取测量设备运行状态的抽象数据。 5.抽象对象(A=0) 5.1通用和服…

yolov10来了!用yolov10训练自己的数据集(原理、训练、部署、应用)

一、引言 YOLOv9还没热乎呢,YOLOv10就出来了,太卷了!太快了! 自今年2月YOLOv9发布之后, YOLO(You Only Look Once) 系列的接力棒传到了清华大学研究人员的手上。YOLOv10推出的消息引发了AI界的…

【第七天】TCP三次握手四次挥手 HTTP的keep-Alive和TCP的keepalive

TCP三次握手四次挥手 既然要了解这些,首先我们要清楚一个概念,半连接队列和全连接队列: 在TCP三次握手中,Linux内核会维护两个队列来管理连接请求。 这两个队列的存在是为了处理并发连接请求,确保服务端能够有效管理新…

设计模式17-适配模式

设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…

《零散知识点 · SpringBoot 整合邮件功能》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

光伏气象仿真系统主要功能点

光伏电站的效能与经济效益受气象条件、地理位置、设计布局等多种因素影响显著。因此,光伏气象仿真系统应运而生,成为提升光伏项目规划、设计、运营管理水平的重要工具。该系统集成了气象数据分析、发电量分析、投融资分析、损耗估算分析及光伏设计等多项…

重磅惊喜!OpenAI突然上线GPT-4o超长输出模型!「Her」高级语音模式已开放测试

在最近的大模型战争中,OpenAI似乎很难维持霸主地位。虽然没有具体的数据统计,但Claude3.5出现后,只是看网友们的评论,就能感觉到OpenAI订阅用户的流失: Claude3.5比GPT-4o好用,为什么我们不去订阅Claude呢&…

【TS】基础(一)

TS基础学习 TS(TypeScript)TS的特性TS的优缺点优点缺点 TS和JS的区别TS常用类型原始类型数组类型别名 type联合类型 |函数对象接口 interface继承 extendsinterface和type的区别 类型断言枚举enum任意类型any TS(TypeScript) TS是JS类型的超集(在JavaScript的基础上…

为什么说脱离决策的数据分析都是无用功

如果你问我数据分析师最重要的能力是什么,我的回答是数据驱动决策,这是数据分析师最值钱的能力,没有之一。 因为数据的价值在于挖掘,与业务和市场进行关联,找到机会点。抛开这个,数据本身一文不值&#xf…

C语言笔记(第n版):知识清单

注:本文参考自【C reference - cppreference.com】和【C 语言参考 | Microsoft Learn】,颇有点借花献佛的意味…… C 程序是一系列包含声明的文本文件(通常为头文件和源文件)的序列。它们经过转换成为可执行程序,当操作…

Bugku ---Web---全题目解析 超详细步骤 持续更新

目录 1.Simple_SSTI_1 2.Simple_SSTI_2 3.滑稽 4.计算器 5.矛盾 6.GET ————————————————————分割线———————————————————— 1.Simple_SSTI_1 SSTI是服务器端模板注入 F12查看下源码 在 Flask 中,双大括号 {{ }} 用…

ElasticSearch父子索引实战

关于父子索引 ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的. 父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有…

Oracle LiveLabs实验:Improve application performance with True Cache

此实验申请地址在这里,时间为120分钟。 帮助见这里。 简介 参加本次动手实践研讨会,了解如何使用 True Cache 通过卸载查询和减少对主数据库的请求和连接数量来提高可扩展性。本次研讨会基于连接到配置了 True Cache 的主数据库的计算实例&#xff08…

从零手写实现 mybatis 系列(零)mybatis 核心特性

拓展阅读 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis。 第二节 从零开始手写 mybatis(二)mybatis interceptor 插件机制详解 第三节 从零开始手写 mybatis(三&#xff0…