数据库的三范式:
第一范式(1NF):字段的原子性
概念:
- 数据库表中的字段都是单一属性的,不可再分。
说明:
- 单一属性的类型包括整型、字符型、逻辑型、日期型等。注:集合、数组等类型不属于单一属性的类型。
第二范式(2NF):记录的唯一性
前提:
- 满足第二范式的前提是先满足第一范式。
概念:
- 非主属性必须完全依赖于主键。
说明:
- 主键可能由多个属性构成,完全依赖指不存在非主属性依赖于主键中的某一部分属性。
第三范式(3NF):非主属性不依赖于其它非主属性
前提:
- 满足第三范式的前提是先满足第二范式。
概念:
- 任何非主属性不依赖于其它非主属性,否则会出现数据的冗余。
说明:
- 第二范式和第三范式都是在说 非主属性对其它属性的依赖关系:
- 第二范式的关键在于:非主属性是否是完全依赖主属性。
- 第三范式的关键在于:非主属性是直接依赖于主属性还是直接依赖于其它非主属性。
事务:
概念:
- 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
特性:
- A:原子性(Atomicity):说明事务是一个不可分割的单位。
- C:一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态.
- *I:隔离性(Isolation):一个事务不能被其他事务打扰。
- D:持久性(Durability):事务一旦提交,就应该被永久保存起来。
事务的隔离级别:
概念:
- 多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。
实现:
- MySQL中Innodb引擎通过数据库锁(表锁、行锁、间隙锁)来实现事务的隔离。
相关概念:
脏读:指一个事务读到了另一个事务中未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取的结果不同,重点是修改。
-
说明:脏读是读取了另一个事务中未提交的脏数据,不可重复读是读取了另一个事务已提交了的数据。
幻读(虚读):在一个事务内读取到了另一个事务插入的数据,导致前后读取的记录数不一致,重点在于新增或者删除。
隔离级别:
- 未提交读(READ UNCOMMITTED):脏读、不可重复读、幻读都有可能发生。
- 特点:隔离级别最低,并发性能高。
- 提交读/不可重复读(READ COMMITTED):能避免脏读,不可重复读、幻读都有可能发生。
- 特点:锁定正在读取的行 ,Oracle默认的隔离级别。
- 可重复读(REPEATABLE READ):能避免脏读、不可重复度,幻读有可能发生。
- 特点:锁定所读取的所有行,MySQL默认的隔离级别。
- 注意:MySQL的InnoDB引擎中,隔离级别为可重复读(REPEATABLE READ)时,通过间隙锁已经解决了幻读的问题。
- 串行化(SERIALIZABLE):能避免脏读、不可重复度、幻读。
- 特点:每次访问都会锁表。
查看/设置隔离级别的语句:
- 查看当前事务的隔离级别: select @@tx_isolation;
- 设置当前事务隔离级别: set transaction isolation level 隔离级别;