数据库三大范式与事务的四大特征

数据库三大范式:

1.第一范式:每一列都是不可分割的原子性数据项,不能是集合、数组非原子数据项;如果一个列中存在多个值,需要将改了拆分成不同的列;第一范式就是每一列保证不可拆分,保证原子性;

符合第一范式
    S_ID    NAME    AGE
    001     张三      30
    002     李四      35

2.第二范式:在满足数据库第一范式的前提下,所有数据必须要完全依赖于主键;如果表中存在复合主键(主键对应两列或者多列)的情况下不符合第二范式;一张表只能描述一件事;表中每一列都必须依赖与主键

不符合第二范式
 S_IDNAMEAGEB_IDBOOKB_TIME
S1001张三30B1001计算机网络2020-01-02
S1002李四35B1002TCP/IP技术2020-01-03

 

整改成第二范式
S_IDNAMEAGE
S1001张三30
S1002李四35
B_IDBOOKB_TIME
B1001计算机网络2020-01-02
B1002TCP/IP技术2020-01-03

 

3.第三范式:满足第二范式的前提下,任何非主键列不得传递依赖于主键(称为解耦不知是否合适?)。传递依赖:A→B→C,C字段传递依赖于A字段,不满足第三范式要求:主键字段A→非主键字段B→非主键字段C

不满足第三范式
S_IDNAMEAGECOLLEGEC_ADD
S1001张三30理学院A1楼
S1002李四35计科院A2楼
S1003赵五30计科院A2楼

 

上表存在传递依赖关系:学号(S_ID)→学院名称(COLLEGE)→学院地址(C_ADD);

处理办法:拆分成两张表,学生信息表、学院信息表,将学院编号(C_ID)作为第一张表的FOREIGN KEY。

整改成第三范式
S_IDNAMEAGEC_ID
S1001张三30C1001
S1002李四35C1002
S1003赵五30C1002

 

C_IDCOLLEGEC_ADD
C1001理学院A1楼
C1002计科院A2楼

事务的四大特征:

1.原子性:不可分割的最小操作单位,要么成功,要是失败;

2.持久性:当事务提交或者回滚后,数据会持久存在;

3.隔离性:多个事务之间相互独立;

4.一致性:事务操作前后,数据的总量不变。

事务的隔离级别:

存在问题:多个事务操作同一批数据,会出现问题,设置了隔离级别可以解决该问题。

1.脏读:一个事务读取到了另外一个事务没有提交的数据;

2.不可重复读(虚读):同一个事务中,两次读取到的数据不一致;

3.幻读:一个事务操作(DML)数据表中所有的记录,另外一个事务添加了一条数据,则导致第一个事务查询不到自己修改的数据。

隔离级别解决问题:

1.read uncommitted:读未提交。会产生:脏读、不可重复读、幻读都会;

示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交;事务2中查询该表数据已经变化;

2.read committed:读已经提交。会产生:不可重复读、幻读;【Oracle默认级别】

示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交;事务2中查询查询该表数据未变化;当事务1执行commit操作,事务2中查询数据才会发生变化;

3.repeatable read:可以重复读。会产生:幻读;【Mysql默认级别】

示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交;事务2中查询查询该表数据未变化;事务1执行commit操作,事务2中查询数据仍未变化,只有当事务2进行commit操作,查询数据时才会发生变化;

4.serializable:串行化,序列化。可以解决以上3中存在问题。

示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交,此时会锁定操作的该数据表;事务2中进行查询会处于卡顿状态,只有事务1进行提交后,事务2执行的查询会自动查出结果。

以上四种隔离级别从1~4安全性越来越高,但是效率越来越低,所以需要选择合适的隔离级别,通常使用默认隔离级别即可,只有针对特殊需求才会调整隔离级别。

设置隔离级别:

#MYSQL8以下版本查询隔离级别
SELECT @@TX_ISOLATION;
#MYSQL8查询隔离级别
SELECT @@TRANSACTION_ISOLATION;
#设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值