2020面试-数据库篇

==数据库事务(简称:事务)==是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

ACID

事务的原子性(atomic) 是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了

事务的一致性(consistency) 是指事务的运行并不改变数据库中数据的一致性.
数据库的状态满足所有的完整性约束,就说该数据库是一致的。

       例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.

事务的隔离性(isolation) 是指并发的事务是相互隔离的。
两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.

事务的持久性(durability)是指事务运行成功以后,就系统的更新是永久的.

数据库四个隔离级别

1、Serializable (串行化):最严格的级别,在读的每一行数据上都加上锁。事务串行执行,资源消耗最大;

2、REPEATABLE READ (重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。

3、READ COMMITTED (提交读) :大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。

4、Read Uncommitted (未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。

三个范式
首先要明确的是:满足着第三范式,那么就一定满足第二范式、满足着第二范式就一定满足第一范式

第一范式:字段是最小的的单元不可再分

学生信息组成学生信息表,有年龄、性别、学号等信息组成。这些字段都不可再分,所以它是满足第一范式的

第二范式:满足第一范式,表中的字段必须完全依赖于全部主键而非部分主键。

其他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依赖于主键,也就成了唯一的
学号为1024的同学,姓名为Java3y,年龄是22岁。姓名和年龄字段都依赖着学号主键。

第三范式:满足第二范式,非主键外的所有字段必须互不依赖

就是数据只在一个地方存储,不重复出现在多张表中,可以认为就是消除传递依赖
比如,我们大学分了很多系(中文系、英语系、计算机系……),这个系别管理表信息有以下字段组成:系编号,系主任,系简介,系架构。那我们能不能在学生信息表添加系编号,系主任,系简介,系架构字段呢?不行的,因为这样就冗余了,非主键外的字段形成了依赖关系(依赖到学生信息表了)!正确的做法是:学生表就只能增加一个系编号字段。

参考博客

DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

视图

视图是一种基于数据表的一种虚表

(1)视图是一种虚表
(2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表
(3)向视图提供数据内容的语句为 SELECT 语句 ,可以将视图理解为存储起来的 SELECT 语句
(4)视图向用户提供基表数据的另一种表现形式
(5)视图没有存储真正的数据 ,真正的数据还是存储在基表中
(6)程序员虽然操作的是视图,但最终视图还会转成操作基表
(7)=一个基表可以有0个或多个视图

视图可以将查询出来的数据进行封装

数据库索引

参考博客

Redis

Java Web开发中,用数据库来进行数据的存储,涉及大数据量的需求(如商品抢购),或系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。

克服以上问题Java Web采用NoSQL技术基于内存的数据库

Redis是NoSQL中的一种,性能优越,支持每秒十几万次读/写操作,性能远超数据库,还支持**集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的 数据存储在内存 中,更让人欣慰的是它还支持一定的 事务能力,这保证了高并发的场景下数据的 安全和一致性

应用场景

存储 缓存 用的数据;
需要高速读/写的场合使用它快速读/写;

日常中对数据的读操作>写操作
一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。

Redis作为缓存的读逻辑
在这里插入图片描述
从上图我们可以知道以下两点:

第一次读取数据的时候,读取 Redis 的数据就会失败,此时就会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。
写操作流程
在这里插入图片描述
所以读操作大于写操作时用Redis

Redis面试题
Redis面试题2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值