数据库

本文深入探讨了数据库的事务概念,包括ACID特性与MVVC多版本并发控制,分析了不同隔离级别(如未提交读、提交读、可重复读和可串行化)及其可能导致的问题。此外,还详细介绍了数据库范式理论,如第一范式到BCNF。文章进一步讲解了索引的重要数据结构,如AVL树、B树和B+树,以及它们在MySQL中的应用,讨论了索引的优缺点、创建原则及查询优化。最后,简述了MySQL的Binlog功能和不同录入格式,强调其在数据恢复和主从复制中的作用。
摘要由CSDN通过智能技术生成

一、 事务

定义:是一个不可分割的数据库操作序列,要么执行,要么不执行。(转账案例)

A:Atomicity 原子性(不可分割)
C:Consistency 一致性(结果一致)
I:Isolation 隔离性(不可见)
D:Durability 持久性 (提交即存储)

MVVC(多版本并发控制)

功能:用于实现事务的并发调度,解决读-写冲突保证不阻塞地读取到一致的数据
工作场景: 可重复读与提交读;

基本原理:源于乐观锁的思想,为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与时间戳关联,读操作只读事务开始前的数据库快照。

注意:MVVC只是一种思想,针对不同的数据库引擎,实现的方式也不一样,InnoDB对于写操作为悲观控制(加锁),读操作使用版本控制。

二、隔离级别

并发出现的问题

  1. 丢失修改:A和B都对一个数据修改,A先改,B随后,B的修改覆盖了A的修改;
  2. 读脏数据:A查询了B修改但未提交的数据,B撤销引起;
  3. 不可重复读:读过一次后进行了修改,再次读数据变了;
  4. 幻影读:读取范围数据,范围内数据增加,则前后读取结果不一致(不可重复读的范围版本?)

未提交读

事务中的修改,即使没有提交,对其它事务也是可见的。

出现的问题:脏读,不可重复读,幻影读;

提交读

一个事务只能读取已经提交的事务所作的修改。即一个事务所做的修改在提交之前对其它事务是不可见的。
从事务开始到对方提交看到的内容是一样的。

出现的问题:不可重复读,幻影读;

可重复读(Mysql默认级别)

保证同一个事务中多次读取同样的数据结果是一样的。(MVCC来实现)
从事务开始到提交看到的内容是一样的。

出现的问题:幻影读;

可串行化

强制事务串行执行。需要加锁实现。(使用Next-Key Locks[锁定一个范围,包含记录本身]实现,锁定整个范围的键

三、范式

第一范式

属性不可分(无重复列)。
即实体中的某个属性不能有多个值或不能有重复的属性。

第二范式

属性完全依赖于主码(候选码/主属性中选出的一个)。(消除了非主属性对码的部分函数依赖)
即非主属性完全依赖于主关键字。

候选码的定义: 当某些属性确定的情况下,除此之外的其它属性值也能被确定,那么这些属性被称为候选码(主属性集合)。
一个候选码可能包含多个属性

不满足第二范式会出现的问题:

  1. 数据冗余;(组合关键字一部分会出现冗余)
  2. 更新异常;(组合关键字一部分更新,另一部分也得更新)
  3. 插入异常;(只有一部分组合关键字时,无法记录)
  4. 删除异常;

第三范式

属性不依赖于其它非主属性
在满足第二范式的基础上,要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(消除了非主属性对码的传递函数依赖)

满足第三范式的数据库表不存在如下关系:
关键字段 → 非关键字段x→非关键字段y

BCNF

若关系模式R为第一范式,且每个属性都不传递依赖于R的候选键。
在第三范式基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖,则满足BCNF。(消除主属性对码的部分依赖与传递函数依赖)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值