一、 事务
定义:是一个不可分割的数据库操作序列,要么执行,要么不执行。(转账案例)
A:Atomicity 原子性(不可分割)
C:Consistency 一致性(结果一致)
I:Isolation 隔离性(不可见)
D:Durability 持久性 (提交即存储)
MVVC(多版本并发控制)
功能:用于实现事务的并发调度,解决读-写冲突,保证不阻塞地读取到一致的数据;
工作场景: 可重复读与提交读;
基本原理:源于乐观锁的思想,为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与时间戳关联,读操作只读事务开始前的数据库快照。
注意:MVVC只是一种思想,针对不同的数据库引擎,实现的方式也不一样,InnoDB对于写操作为悲观控制(加锁),读操作使用版本控制。
二、隔离级别
并发出现的问题
- 丢失修改:A和B都对一个数据修改,A先改,B随后,B的修改覆盖了A的修改;
- 读脏数据:A查询了B修改但未提交的数据,B撤销引起;
- 不可重复读:读过一次后进行了修改,再次读数据变了;
- 幻影读:读取范围数据,范围内数据增加,则前后读取结果不一致(不可重复读的范围版本?)
未提交读
事务中的修改,即使没有提交,对其它事务也是可见的。
出现的问题:脏读,不可重复读,幻影读;
提交读
一个事务只能读取已经提交的事务所作的修改。即一个事务所做的修改在提交之前对其它事务是不可见的。
从事务开始到对方提交看到的内容是一样的。
出现的问题:不可重复读,幻影读;
可重复读(Mysql默认级别)
保证同一个事务中多次读取同样的数据结果是一样的。(MVCC来实现)
从事务开始到提交看到的内容是一样的。
出现的问题:幻影读;
可串行化
强制事务串行执行。需要加锁实现。(使用Next-Key Locks[锁定一个范围,包含记录本身]实现,锁定整个范围的键)
三、范式
第一范式
属性不可分(无重复列)。
即实体中的某个属性不能有多个值或不能有重复的属性。
第二范式
属性完全依赖于主码(候选码/主属性中选出的一个)。(消除了非主属性对码的部分函数依赖)
即非主属性完全依赖于主关键字。
候选码的定义: 当某些属性确定的情况下,除此之外的其它属性值也能被确定,那么这些属性被称为候选码(主属性集合)。
一个候选码可能包含多个属性。
不满足第二范式会出现的问题:
- 数据冗余;(组合关键字一部分会出现冗余)
- 更新异常;(组合关键字一部分更新,另一部分也得更新)
- 插入异常;(只有一部分组合关键字时,无法记录)
- 删除异常;
第三范式
属性不依赖于其它非主属性。
在满足第二范式的基础上,要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(消除了非主属性对码的传递函数依赖)
满足第三范式的数据库表不存在如下关系:
关键字段 → 非关键字段x→非关键字段y
BCNF
若关系模式R为第一范式,且每个属性都不传递依赖于R的候选键。
在第三范式基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖,则满足BCNF。(消除主属性对码的部分依赖与传递函数依赖)