数据库重点

本文详细介绍了数据库中的事务概念,包括原子性、一致性、隔离性和持久性四大特性。重点阐述了事务的隔离级别,如读未提交、读已提交、可重复读和序列化,以及它们在并发操作中的影响。同时,讨论了数据库索引的作用和类型,如B+树和哈希索引。最后,提及了数据库设计的三范式以及SQL语句中的where、group by和having子句的用途。

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

概念:

  • 数据库: 英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了 具有特定格式的数据。

  • 数据库管理系统: DataBaseManagement,简称DBMS。 数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以 对数据库当中的数据进行增删改查。常见的数据库管理系统: MySQL、Oracle、MS SqlServer、DB2、sybase等…

  • 事务: 一个事务其实就是一个完整的业务逻辑。是一个最小的工作单元。不可再分。

    • 什么是一个完整的业务逻辑? 假设转账,从A账户向B账户中转账10000. 将A账户的钱减去10000(update语句) 将B账户的钱加上10000(update语句) 这就是一个完整的业务逻辑。
    • 以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的。
    • nsert delete update 只有以上的三个语句和事务有关系,其它都没有关系。
    • 事务:就是批量的DML语句同时成功,或者同时失败! (DQL: 数据查询语言(凡是带有select关键字的都是查询语句) select…
      DML: 数据操作语言(凡是对表当中的数据进行增删改的都是DML) insert delete update insert 增 delete 删 update 改)
      这个主要是操作表中的数据data。)
  • InnoDB实现事物

    • InnoDB存储引擎:提供一组用来记录事务性活动的日志文件
    • 在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。
    • 在事务的执行过程中,我们可以提交事务,也可以回滚事务。
    • 提交事务 commit; 语句
    • 回滚事务 rollback; 语句(回滚永远都是只能回滚到上一次的提交点!)
  • 事物的四个特性

    • A:原子性 说明事务是最小的工作单元。不可再分。
    • C:一致性 所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败, 以保证数据的一致性。

    • I:隔离性 A事务和B事务之间具有一定的隔离。 教室A和教室B之间有一道墙,这道墙就是隔离性。 A事务在操作一张表的时候,另一个事务B也操作这张表会那样???

    • D:持久性 事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据 保存到硬盘上!

  • 事务的隔离性
    • 事务和事务之间四个隔离级别(并发操作不加控制会导致1.丢失数据修改。2.读“脏数据”。3.不可重复读。4.产生幽灵数据)
      • 读未提交:read uncommitted(最低的隔离级别)
        • 事务A可以读取到事务B未提交的数据。
        • 这种隔离级别存在的问题就是:脏读现象!(Dirty Read)我们称读到了脏数据。
        • 事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100.可能会导致脏读、幻读或不可重复读。
      • 读已提交:read committed
        • 事务A只能读取到事务B提交之后的数据。
        • 对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取的A是50,刚读取完,A就被修改成100,这个时候另一个事务再进行读取发现A就突然变成100了;可以阻止脏读,但是幻读或不可重复读仍有可能发生
        • 这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实
        • oracle数据库默认的隔离级别是:read committed
      • 可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
        • 事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。

        • 可重复读可能会出现幻影读。每一次读取到的数据都是幻象。不够真实!

        • 早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!读到的是假象。不够绝对的真实。

        • mysql中默认的事务隔离级别就是这个!!!!!!!!!!!

      • 序列化/串行化:serializable(最高的隔离级别)
        • 这是最高隔离级别,效率最低。解决了所有的问题。
        • 这种隔离级别表示事务排队,不能并发!
        • synchronized,线程同步(事务同步)每一次读取到的数据都是最真实的,并且效率是最低的。
          在这里插入图片描述
        • 多个事务的并行执行是正确的当且仅当结果与按某一顺序的串行执行结果相同。两段锁协议是实行可串行化调度的充分条件。
    • 索引:索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
      • 都知道数据库索引采用B+树而不是B树,原因也有很多,主要原因是什么?
        • 主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
      • 在mysql数据库当中索引也是需要排序的,MySQL索引主要使用的两种数据结构是什么?
        • 哈希索引,对于哈希索引来说,底层的数据结构肯定是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引

        • BTree索引,Mysql的BTree索引使用的是B树中的B+Tree,BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。

  • 数据库三范式
    • 第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。

    • 第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键, 不要产生部分依赖。

    • 第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键, 不要产生传递依赖。

    • 设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。但规范程度越高,查询速度越慢(因为表多,连接表需要费时间)

    • where子句用来帅选from子句中指定的数据源中产生的行数据
    • group by 子句用于对where子句筛选后的结果数据进行分组
    • having子句用来对分组后的结果数据再进行筛选(即对行过滤用where, 对组过滤用having)。
  • 简述系统故障时的数据库恢复策略?
    答:真想扫描日志文件,找出故障发生前已提交的事务,将其重做;同时找出故障发生时未完成的事务,并撤销这些事务(即重做已完成的,撤销未完成的)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值