定义
重要概念
元组,数据库中表的一条记录
候选码,一个或多个属性的组合,它们可以唯一地确定表中的一条记录。
主属性, 构成候选码的属性称为主属性。
非主属性,除了主属性外的属性
主码(主键), 是从候选码中选出的一个特定的属性或属性组合,用来在表中唯一标识每一条记录。
函数依赖
(在数据库原理中的函数依赖,将数学符号替换为具体描述)
完全函数依赖,候选码可以唯一确定一条记录
部分函数依赖,有部分主属性可以确定非主属性 ,即候选码的一部分能够决定非主属性。
传递函数依赖,主属性可以确定部分非主属性B,B又可以确定非主属性C,反之无法推出关系, ,即存在单向依赖链。
数据库范式
1NF, 一个表中的所有字段都是不可分割的属性
2NF,消除了非主属性对于候选码(主码)的部分函数依赖
3NF,消除了非主属性对于候选码(主码)的传递函数依赖
BCNF,消除了主属性对于候选码(主码)的部分和传递依赖
4NF,存在多值依赖,X->->Y,既只有候选码(主码),例如选课关系(学生编号,课程号)
数据库并发问题场景总结
事务A读- 事务B读:不存在任何问题。
事务A读- 事务B写: 有线程安全问题,可能出现脏读、幻读、不可重复读。
事务A写- 事务B写:有线程安全问题,可能存在更新丢失等。
以MYSQL数据库来分析四种隔离级别
第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读(未提交的也能读到)此行数据,这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据,
第二种隔离级别:Read committed(读提交)
读已提交,一个事务只能看到其他并发的已提交事务所作的修改解决了脏读问题,但无法解决可重复读,这是oracle的默认隔离级别
第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,结果都是一样的,原理是第一次select时mvcc生成view read,后续再次读取读到的都是第从这个view read中取出数据,即便是后续这条数据被修改多次,但读取的时候不会收到影响,解决了不可重复读同时也解决了幻读的问题,这是mysql的默认隔离级别
第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读,解决一切事物并发问题
总结
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低,像Serializeble这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况来,
在MYSQL数据库中默认的隔离级别是Repeatable read(可重复读)。
在MYSQL数据库中,支持上面四种隔离级别,默认的为Repeatable read(可重复读);而在Oracle数据库中,只支持Serializeble(串行化)级别和Read committed(读已提交)这两种级别,其中默认的为Read committed级别
链接:https://blog.csdn.net/wwwwwww31311/article/details/114751493