当前位置: 首页 > news >正文

数据库面试

1.  简单介绍一下Spring中的事务管理。

        答:事务就是对一系列的数据库操作(比如将insert,delete,update,select多条sql语句)作为一个整体执行,进行统一的提交或回滚操作,如果这组sql语句全部执行成功,那么一起成功,如果中间有一条sql语句出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库的数据出现问题。

Spring什么时候提交事务,回滚事务呢:

        1)当你的业务方法执行成功,没有异常抛出,spring在方法执行后提交事务(自动提交,不需要你写代码)。自动调用事务管理器的commit

        2)当你的业务方法抛出运行时异常或ERROR, spring执行回滚,spring会自动调用事务管理器的rollback 

2.在什么时候想到使用事务

        答:当我的操作涉及得到多个表,或者是多个sql语句的insert,update,delete操作。并且我需要保证这些sql语句是作为一个整体执行,要么全部执行成功。


3.在java代码中写程序,控制事务,此时事务应该放在那里呢? 

        答: service层的业务方法上,因为业务方法会调用持久层的dao方法,执行多条sql语句

4.spring框架中提供的事务处理方案:一共有两种: 

  1. 适合中小项目使用的, 注解方案:

        spring框架自己用aop实现给业务方法增加事务的功能, 使用@Transactional注解增加事务。

  1.  @Transactional注解是spring框架自己的注解,放在public方法的上面,表示当前方法具有事务。可以给注解的属性赋值,表示具体的隔离级别,传播行为,超时时间,异常信息等等
  2.   @Transactional 若用在方法上,只能用于 public 方法上。对于其他非 public 方法,如果加上了注解@Transactional,虽然 Spring 不会报错,但不会将指定事务织入到该 方法中。因为 Spring 会忽略掉所有非 public 方法上的@Transaction 注解。
  3.   若@Transaction 注解在类上,则表示该类上所有的方法均将在执行时织入事务。

 

2. 事务的4个特性?

答:ACID。

        原子性(Atomic):事务是由一个或多个活动所组成的一个工作单元。原子确保事务中的所有操作全部发生或全部不发生。如果所有的活动都成功了,事务也就成功了。如果任意一个活动失败了,整个事务也失败并回滚。

        一致性(Consistent):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态。现实的数据不应该被损坏。

        隔离性(Isolated):事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起。因此,事务应该被彼此隔离,避免发生同步读写相同数据的事情(注意的是,隔离性往往涉及到锁定数据库中的行或表)。

        持久性(Durable):一旦事务完成,事务的结果应该持久化,这样就能从任何的系统崩溃中恢复过来。这一般会涉及将结果存储到数据库或其他形式的持久化存储中。
 

通俗的说事务,指一组操作,要么都成功执行,要么都不执行(原子性)

在所有的操作没有执行完毕之前,其它会话不能够看到中间改变的过程(隔离性)

事务发生前和发生后,数据的总额保持不变(一致性)

事务产生的影响不能被撤销(持久性)

4、事务中有几种隔离级别呢?

答:4种。读未提交(uncommitted)、读已提交(committed)、可重复读(repeatable_read)、串行化(serializable)。

读未提交(uncommitted):允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读。

读已提交(committed):允许读取并发事务已经提交的数据。可以阻止脏读、但是幻读或不可重复读仍有可能发生。

可重复读(repeatable_read):可以阻止脏读和不可重复读,但可能会导致幻读。

串行化(serializable):完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读。这是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的。
 

5、 Spring的事务管理器

    jdbc访问数据库,处理事务  Connection conn ; conn.commit(); conn.rollback();
    mybatis访问数据库,处理事务, SqlSession.commit();  SqlSession.rollback();
    hibernate访问数据库,处理事务, Session.commit(); Session.rollback();

        由于不同的数据库访问技术,处理事务的对象,方法不同,为了简化对数据库事务的操作,spring提供了一种统一的事务处理模型, 能使用统一步骤,方式完成对不同的数据库访问技术的事务处理。Spring提供了一个接口PlatformTransactionManager,这个接口中定义了事务重要方法 commit ,rollback等,不同的数据库访问技术对应不同的事务管理器实现类

        我们只需在spring的配置文件中声明数据库访问技术对应的事务管理器即可。

        当配置好事务管理器之后,在spring中具体配置事务时,采用的是声明式事务。声明式事务是通过事务属性来定义的,具体的说,是通过传播行为、隔离级别、超时时间以及回滚规则来进行定义的。

串行化。不存在并发问题。

传播行为:你的业务方法调用时,事务在方法之间是如何使用的。

相关文章:

  • Docker 基础使用(5)Compose
  • 560. 和为 K 的子数组
  • RoCE网络架构在高性能计算的应用
  • [Golang] go-kit 介绍和使用 (微服务实现工具)
  • 【漏洞复现】飞企互联-FE企业运营管理平台 treeXml.jsp SQL注入漏洞
  • 【每日刷题】Day66
  • Web前端开发12章:深入探索与实战解析
  • Elixir学习笔记——输入输出和文件系统
  • React组件通信方式总结
  • Golang学习笔记01
  • CMU最新论文:机器人智慧流畅的躲避障碍物论文详细讲解
  • 卡尔曼滤波原理及应用(一)
  • Web前端后端架构:构建高效、稳定与可扩展的互联网应用
  • cnvd_2015_07557-redis未授权访问rce漏洞复现-vulfocus复现
  • 【0基础学爬虫】爬虫基础之自动化工具 DrissionPage 的使用
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CentOS 7 防火墙操作
  • Codepen 每日精选(2018-3-25)
  • css布局,左右固定中间自适应实现
  • Java|序列化异常StreamCorruptedException的解决方法
  • js数组之filter
  • LeetCode算法系列_0891_子序列宽度之和
  • Median of Two Sorted Arrays
  • MYSQL 的 IF 函数
  • Netty 4.1 源代码学习:线程模型
  • Web设计流程优化:网页效果图设计新思路
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零开始的无人驾驶 1
  • 入门级的git使用指北
  • 我从编程教室毕业
  • 小而合理的前端理论:rscss和rsjs
  • 责任链模式的两种实现
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​flutter 代码混淆
  • ​queue --- 一个同步的队列类​
  • # 数论-逆元
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (排序详解之 堆排序)
  • (七)Activiti-modeler中文支持
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)elasticsearch 源码之启动流程分析
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core中的时区转换问题
  • .net SqlSugarHelper
  • .NET正则基础之——正则委托
  • .Net中ListT 泛型转成DataTable、DataSet
  • ::
  • [2]十道算法题【Java实现】
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心