【Java面试课程】数据库

本文深入探讨MySQL的事务隔离级别、悲观锁与乐观锁原理,解析数据库优化策略,包括慢查询定位、遵循范式、索引选择及分表技术,助您提升数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

典型回答

事务隔离

所谓隔离级别(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性而提出的定义。

每种关系数据库都有自己特色的隔离级别实现,虽然通常的定义是以锁为实现单元。但实际表现千差万别。

以最常见的MySQL innoDB引擎为例,它是基于MVCC(Multi-Versioning Concurrency Control)和锁的复合实现。
按照隔离程度从低到高,MySQL事务隔离级别分为四个不同的层次:

  • 读未提交(Read uncommitted),就是一个事务能看到其他事务尚未提交的修改。隔离水平最低,允许脏读
  • 读已提交(Read committed),就是事务能看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,也不会出现脏读。但级别仍然很低,并不保证下一次能够读到同样的数据(允许其他事务并发修改数据),也就是允许不可重复读和幻象读出现
  • 可重复读(Repeatable reads),保证同一个事务中多次读到的数据是一致的。这是MySQL innoDB引擎默认的隔离级别。
  • 串行化(Serializable):并发事务之间是串行的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁。这是最高的隔离级别。
悲观锁/乐观锁

至于悲观锁和乐观锁,也并不是 MySQL 或者数据库中独有的概念。而是并发编程的基本概念。
主要区别在于:
操作共享数据时,悲观锁认为数据出现冲突的可能性会更大,而乐观锁则是认为大部分情况下不会发生冲突,进而决定是否采取排他性措施

反映到MySQL中。悲观锁对数据加锁,防止其他事务意外修改数据。乐观锁则与Java并发包中的AtomicFieldUpdater类似,也是采用CAS机制,并不会对数据加锁,而是通过比较数据的版本号或时间戳来实现乐观锁需要的版本判断

1.数据库的分类和常用的数据库

数据库的分类:

  • 关系型数据库
  • 非关系型数据库

常用的关系型数据库:

  • MySQL
  • Oracle

常用的非关系型数据库:

  • redis
  • mongodb
  • hadoop

2.MySQL有几种存储引擎。比较一下InnoDB和MyISAM

存储引擎

MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。

每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛而不同的功能。

MySQL支持的存储引擎有

  • MyISAM
  • InnoDB
  • Memory
  • CSV
  • Archive

并发控制
当多个连接对记录进行修改时保证数据的一致性和完整性

在处理并发读和并发写的时候,系统会使用一些锁系统来控制。
这里的锁有

  • 共享锁(读锁):同一时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生变化
  • 排他锁(写锁):在任何时候只加粗样式能有一个用户写入资源,当进行写操作时会阻塞其他的读锁或者写锁操作。

锁的粒度指得是锁定时的单位。只需要对修改的数据精确加锁,而无需对所有数据加锁。加锁只需要加最对的,不需要最大的。加锁会增加系统开销。锁策略寻求锁开销与数据安全之间寻求一种平衡。

MySQL的锁颗粒

  • 表锁,开销最小的锁策略,获取整个表的权限
  • 行锁,开销最大的锁策略,支持最大并发处理

事务处理
事务用来保证数据库的完整性

事务特性:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

索引
对数据库中的一列或多列进行排序的一种结构。好比于书的目录。


在这里插入图片描述
Memory其实是存储在内存中,大小由内存决定。
MyISAM:适用于事务处理不多的情况
InnoDB:适用于事务处理比较多,需要由外键支持的情况。

MyISAM与InnoDB的区别

  • 事务安全
  • 查询和添加速度 (myisam不用考虑同步锁,速度快)
  • 全文索引 (myisam支持)

2.简要介绍一下关系数据库三范式

什么是范式
简单理解就是规范,就是关系型数据库在设计表的时候要遵循的规范

要满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式

第一范式指 数据库中表的每一列都是不可分割的基本数据项,同一列中不可能有多个值。即实体中的某个属性不能有多个值或不能有多个重复的属性。列数据的不可分割

第二范式指 数据库中表的每一行必须可以被唯一的区分。为实现区分通常需要为表加上一个列,以识别各个实例的唯一标志。主键

第三范式指 要求一个数据表中不能包含已在其他表中已包含的非主关键字信息 外键

反三范式,有的时候为了效率,可以设置重复或者可以推导的字段
订单(总价)和订单项(单价)

3. 事务四个基本特征 ACID特性

什么是事务
事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做要么都不做,是一个不可分割的工作单位。

比如一个转账 必须 A账号扣钱成功 B账号加钱成功 这就是事务

事务必须满足四大特征:

  • 原子性 (表示事务内操作不可分割。要么都成功,要么都失败)
  • 一致性 (要么都成功,要么都失败。后面的失败了要对前面的操作进行回滚,保持数据一致 )
  • 隔离性 (一个事务开始后,不能受其他事务干扰)
  • 持续性 (表示事务开始了,就不能停止)

4.mysql数据库默认的最大连接数

为什么需要最大连接数?
特定服务器上的数据库只能支持一定数目同时连接,这时候我们一般都会设置最大连接数(最多同时服务多少连接)。在数据库安装的时候都会有一个默认的最大连接数100。

max_connections=100

最大连接数是100。

5.说一下mysql的分页?Oracle的分页

为什么需要分页?在很多数据库,不可能完全显示数据,进行分段显示
mysql是使用关键字limit进行分页的

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset  

limit offset,size 第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目

Oracle的分页大部分情况下是记不住的,大概是使用三层嵌套查询 思路可以从之前项目翻或者上网搜

6.简单讲一下触发器的使用场景

触发器需要有触发条件。当条件满足以后做什么操作

触发器的应用场景还是很多的,比如QQ上发一个日志自动通知好友,其实就是在增加日志的时候做一个后触发,再向通知表中写入条目。触发器的效率非常的高

每发布一个帖子,就希望同时将版面表中的最后发帖时间、帖子总数进行同步更新,用触发器效率就非常高

create trigger insertArticle_Trigger after insert on artrcle1 for each row begin 
update board1 set articleCount=articleCount+1 where id = NEW.bid
end;

7.简要讲一下数据库的存储过程的使用场景

数据库存储过程具有以下优点

  1. 存储过程只在创建时进行编译,以后每次执行都不需再重新编译。而一般SQL语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度
  2. 复杂的业务逻辑需要多条SQL语句,这些语句要分别从客户机发送到服务器,如果操作很多会发生大量的网络传输,如果把这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会减少,减低网络负载
  3. 存储过程创建一次便可以重复使用,降低数据库开发人员的工作量
  4. 安全性高,存储过程可以屏蔽对数据库对象的直接访问

定义存储过程

create procedure insert_Student(_name carchar(50),_age int,out_id int)
begin
	insert into student value(null,_name,_age);
	select max(stuId) into _id from student;
end;

call insert_Student('wfz',23,@id)
select @id;

7.有没有做过数据库优化方面的事情?

定位:查找、定位慢查询
优化手段:

  • 创建索引。创建完合适的索引,可以先在索引中查询,查询到以后直接在索引中查询
  • 分表:一张表的数据比较多或者一张表的某些字段的值比较多但是很少使用时,采用水平分表和垂直分表来优化
  • 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群
  • 缓存:使用redis缓存
  • 一些常用的优化技巧

7.1 查找并定位慢查询

在项目转测试之前,启动mysql数据库时开启慢查询,并且把执行慢的语句写入到日志中去,运行一定时间后,通过查找日志找到慢查询语句

使用explain 慢查询语句,详细分析语句的问题

7.2 数据库优化之遵循范式

1范式列具有原子性
2范式表中记录具有唯一性
3范式外键(表的信息如果能推导出来,就不应该单独设计一个字段)

7.3 选择合适索引

在这里插入图片描述

7.4 索引使用的小技巧

索引弊端:

  1. 占用磁盘空间
  2. 对(插入、修改、删除)操作有影响,变慢

使用场景
3. 在查询的时候做,不做查询不做
4. 字段不是唯一的几个值(比如sex)
5. 内存字段不是频繁变化

7.5 数据库优化之分表

分为水平分表(行)和垂直分表(列)

后期再看https://www.bilibili.com/video/av29546706/?p=71

8. jdbc调用存储过程

jdbc调用所执行的步骤

  1. 加载驱动(com.mysql.jdbc.Driver)
  2. 获取连接
  3. 设置参数
  4. 执行
  5. 释放连接 (释放连接要从小到大,必须放到finall中去)

9. 简单说一下你对jdbc的理解

Java Database connection
数据库(mysql、server)有很多,底层命令都是不一样的.
为了适用所有的数据库,需要定义一个接口。由各种服务器使用自己的语言去实现java接口,这个接口就是jdbc。
在这里插入图片描述
java只定义接口,让服务器厂商实现接口。对开发者而言,只需要导入对应厂商的实现即可,然后以接口的形式进行调用(mysql+mysql驱动+jdbc)

10。写一个jdbc的程序

jdbc调用所执行的步骤

  1. 加载驱动(com.mysql.jdbc.Driver)
  2. 获取连接 (DriverManger.getConnection(url,username,password))
  3. 设置参数 (cstmt.setXXX(index,value))
  4. 执行 (executeQuery executeUpdate)
  5. 释放连接 (释放连接要从小到大,必须放到finall中去)

11.JDBC中的PreparedStatement相比Statement的好处

大多数时候采用PreparedStatement代替Statement

  1. PreparedStatement是预编译的,比Statement速度快
  2. PreparedStatement代码的可读性和可维护性好
  3. PreparedStatement可以防止SQL注入攻击,而Statement不能。因为PreparedStatement是预编译的

12.数据库中连接池作用

  1. 限定数据库连接的个数 不会导致由于数据库连接过多而导致系统运行缓慢或崩溃
  2. 数据库连接不需要每次都去创建或销毁,节约了资源,
  3. 数据库连接不需要每次都去创建或销毁 响应时间更快

与线程池的作用类似

面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案.以下是部分目录: java面试题01.面试的整体流程.mp4 │ Java面试题02.java的垮平台原理.mp4 │ Java面试题03.搭建一个java的开发环境.mp4 │ Java面试题04.java中int占几个字节.mp4 │ Java面试题05.java面向对象的特征.mp4 │ Java面试题06.装箱和拆箱.mp4 │ Java面试题07.==和equals的区别.mp4 │ Java面试题08.String.mp4 │ Java面试题09.讲一下java中的集合.mp4 │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试题12.实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式 怎么启动线程怎么区分线程.mp4 │ Java面试题14.线程发库和线程池的作用?.mp4 │ Java面试题15.设计模式和常用的设计模式.mp4 │ Java面试题16.http get post请求的区别.mp4 │ Java面试题17.说说你对Servlet的理解.mp4 │ Java面试题18.Servlet的生命周期.mp4 │ Java面试题19.forward和redirect的区别.mp4 │ Java面试题20.jsp和Servlet的相同点和不同点?.mp4 │ Java面试题21.内置对象和四大作用域和页面传值.mp4 │ Java面试题22.Session和Cookie的区别.mp4 │ Java面试题23.mvc模式和mvc各部分的实现.mp4 │ Java面试题24.数据库分类和常用数据库.mp4 │ Java面试题25.关系型数据库的三范式.mp4 │ Java面试题26.事务的四大特征.mp4 │ Java面试题27.mysql数据库最大连接数.mp4 │ Java面试题28.mysql和oracle的分页语句(着重说思路).mp4 │ Java面试题29.触发器的使用场景.mp4 │ Java面试题30.存储过程的优点.mp4 │ Java面试题31.jdbc调用存储过程.mp4 │ Java面试题32.简单说一下你对jdbc的理解.mp4 │ Java面试题33.写一个jdbc的访问oracle的列子.mp4 │ Java面试题34.jdbc中preparedStatement比Statement的好处.mp4 │ Java面试题35.数据库连接池的作用.mp4 │ Java面试题36.HTML.mp4 │ Java面试题37.简单介绍了一下Ajax.mp4 │ Java面试题38.js和JQuery的关系.mp4 │ Java面试题39.jQuery中的常用选择器.mp4 │ Java面试题40.jQuery中页面加载完毕事件.mp4 │ Java面试题41.jQuery中Ajax和原生js实现Ajax的关系.mp4 │ Java面试题42.简单说一下html5.mp4 │ Java面试题43.简单说一下css3.mp4 │ Java面试题44.bootstrap的是什么.mp4 │ Java面试题45.什么是框架.mp4 │ Java面试题46.简单介绍一下MVC模式.mp4 │ Java面试题47.简单说一下对mvc框架的理解.mp4 │ Java面试题48.struts2的执行流程或者struts2的原理.mp4 │ Java面试题49.Struts2的拦截器是什么?你都用它干什么?.mp4 │ Java面试题50.Spring MVC的执行流程.mp4 │ Java面试题51.SpringMVC和Struts2的不同.mp4 │ Java面试题52.简单介绍一下Spring或者Spring的两大核心.mp4 │ Java面试题53.AOP是什么?都用它做什么?.mp4 │ Java面试题54.Spring事务的传播特性和隔离级别.mp4 │ Java面试题55.ORM是什么?ORM框架是什么?.mp4 │ Java面试题56.ibatis和hibernate有什么不同.mp4 │ Java面试题57.hibernate对象状态及其转换.mp4 │ Java面试题58:hibernate的缓存.mp4 │ Java面试题59.webservice的使用场景.mp4 │ Java面试题60.Activiti的简单介绍.mp4 │ Java面试题61.linux的使用场景.mp4 │ Java面试题62.linux常用命令.mp4 │ Java面试题63:怎么操作linux服务器.mp4 │ Java面试题64:有没有使用过云主机.mp4 │ Java面试题65:数据库优化方面的事情.mp4 │ Java面试题66:如果查询和定位慢查询.mp4 │ Java面试题67:数据库优化之数据库表设计遵循范式.mp4 │ Java面试题68:选择合适的数据库引擎.mp4 │ Java面试题69:选择合适的索引.mp4 │ Java面试题70:使用索引的一些技巧.mp4 │ Java面试题71:数据库优化之分表.mp4 │ Java面试题72:数据库写分离.mp4 │ Java面试题73:数据库优化之缓存.mp4 │ Java面试题74:sql语句优化小技巧.mp4 │ Java面试题75:批量插入几百万条数据.mp4 │ Java面试题76:有没有使用过redis.mp4 │ Java面试题77:redis的使用场景.mp4 │ Java面试题78:redis存储对象的方式.mp4 │ Java面试题79:redis数据淘汰机制.mp4 │ Java面试题80:java访问redis级redis集群?.mp4 │ Java面试题81:微信公众号分类和微信开发原理.mp4 │ Java面试题82:怎么把微信和业务平台进行绑定.mp4 │ Java面试题83:项目的分类和项目参与者.mp4 │ Java面试题84:项目流程和业务注意事项.mp4 │ 面试必问-Mysql索引背后的故事 │ ├─java面试专属 │ ├─1.面试必考之HashMap源码分析与实现 │ │ 1.面试必考之HashMap源码分析与实现.mp4 │ │ │ ├─2.探索JVM底层奥秘ClassLoader源码分析与案例讲解 │ │ 2.探索JVM底层奥秘ClassLoader源码分析与案例讲解.wmv │ │ │ ├─3.、分布式、无实战全局性ID-悟空 │ │ 3.、分布式、无实战全局性ID-悟空.mp4 │ │ │ ├─4.SpringMvc深入理解源码分析 │ │ 4.SpringMvc深入理解源码分析-悟空.mp4 │ │ │ ├─5.Nosql Redis Jedis常用命令 │ │ 5.Nosql Redis Jedis常用命令-悟空.mp4 │ │ │ ├─6.互联网系统垂直架构之Session解决方案 │ │ 6.互联网系统垂直架构之Session解决方案.mp4 │ │ │ ├─7.分布式框架ZooKeeper之服务注册与订阅 │ │ 7.分布式框架Zookeeper之服务注册与订阅.mp4 │ │ │ ├─8.高性能网络编程必备技能之IO与NIO阻塞分析 │ │ 8.高性能网络编程必备技能之IO与NIO阻塞分析.mp4 │ │ │ ├─9.JAVA发编程之多线程发同步业务场景与解决方案 │ │ 9.JAVA发编程之多线程发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11.高性能必学之Mysql主从架构实践 │ │ 11.高性能必学之Mysql主从架构实践.mp4 │ │ │ ├─12.架构师不得不知道的Spring事物不能回滚的深层次原因 │ │ 12.架构师不得不知道的Spring事物不能回滚的深层次原因.mp4 │ │ │ ├─13.RPC底层通讯原理之Netty线程模型源码分析 │ │ 13.RPC底层通讯原理之Netty线程模型源码分析.wmv │ │ │ ├─14.分库分表之后分布式下如何保证ID全局唯一性 │ │ 14.分库分表之后分布式下如何保证ID全局唯一性.mp4 │ │ │ └─15.大型公司面试必答之数据结构与算法精讲 │ 大型公司面试必答之数据结构与算法(一)-达摩老师.mp4 │ 大型公司面试必答之数据结构与算法(二).mp4 │ ├─面试必问-JVM性能调优 │ JVM性能调优 2018-10-25.mp4 │ ├─面试必问-mybaits源码分析 │ │ 鲁班学院-上课笔记mybaits源码分析9-05.docx │ │ │ └─mybaits源码分析 │ mybaits源码分析.mp4 │ ├─面试必问-springcloud架构微服务项目 │ springcloud架构微服务项目.mp4 │ ├─面试必问-SpringMVC源码分析 │ SpringMVC源码分析.mp4 │ ├─面试必问-webservice原理分析 │ webservice原理分析.mp4 │ ├─面试必问-使用Springboot快速搭建SSM框架 │ 使用SpringBoot快速搭建SSM框架.mp4 │ ├─面试必问-双十一系统架构之Mysql索引技术剖析 │ 双十一系统架构之Mysql索引技术剖析.mp4 │ ├─面试必问-大牛带你手写dubbo框架 │ 大牛带你手写Dubbo框架.mp4 │ ├─面试必问-实战分布式之手写分布式事务框架 │ 实战分布式之手写分布式事务框架.mp4 │ ├─面试必问-带你精通springAOP—面试无忧虑 │ 带你精通AOP——面试无忧虑.mp4 │ ├─面试必问-微服务架构深入浅出讲解springcloud │ 微服务架构 --深入浅出讲解springcloud.mp4 │ ├─面试必问-教你手写MyBatis框架 │ 一小时教你手写MyBatis框架.mp4 │ ├─面试必问-架构杀手锏——java混乱的日志体系 │ java混亂日志体系源码揭秘.mp4 │ ├─面试必问-深入微服务之SpringBoot&Docker1 │ 深入微服务之SpringBoot&Docker.mp4 │ └─面试必问-聊聊哈希算法与HashMap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值