一、事务
1.1 事务介绍
张三李四各有1000元,如果张三要转账给李四要完成下图两个SQL语句,如果李四的语句由于某种原因没有执行成功,张三减了500但是李四没有增加500,就要通过事务还原执行前的情况
事务: 一条或多条SQL语句组成一个执行单元,其特点是这个单元要么同时成功要么同时失败。
- 单元中的每条SQL语句都相互依赖,形成一个整体。
- 如果某条SQL语句执行失败或者出现错误,那么整个单元就会撤回到事务最初的状态。
- 如果单元中所有的SQL语句都执行成功,则事务就顺利执行。
1.1 事务的操作
当事务其中一条语句执行失败时回滚事务,执行
开启事务:事务开始后执行事务如果没有出问题,就要在最后执行commit提交事务;如果中途发生了问题,比如李四没有执行成功,则要执行rollback来回滚事务。
1.2 事务的提交方式
查询数字1代表自动提交,0代表手动提交。
mysql默认自动提交,手动提交是执行了SQL语句表里面的值发生了变化,但是只是临时性的变化,退出操作页面查看表格发现数字还是之前没操作之前的数字。
1.3 事务的四大特征
1.3.1 四大特征概念
- 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 - 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。也就是说一个事务执行之前和执行之后都必须处于一致性状态。 - 隔离性(isolcation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务。不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 - 持久性(durability)
持久性是指一个事务一旦被提交了, 那么对数据库中的数据的改变就是永久性的。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
1.3.2 事务的隔离级别
事务的隔离级别
多个客户端操作时,各个客户端的務之间应该是隔离的,相互独立的,不受影响的。而如果多个事务操作同一批数据时,就会产生不同的问题,我们需要设置不同的隔离级别来解决这些问题。
隔离级别分类
随着隔离级别越来越高,执行效率也越来越低。
引发的问题
操作数据库隔离级别
横线处为要修改成的数据库隔离级别。
二、数据库设计三范式
2.1 数据库设计范式概念
数据库表的设计依据,教你怎么进行数据库表的设计。
2.2 三范式
- 第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
- 第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。
- 第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。
2.2.1 第一范式
最核心,最重要的范式,所有表的设计都需要满足。
必须有主键,并且每一一个字段都是原子性不可再分。
以上学生表不符合第一范式,因为没有主键,联系方式也还能细分为邮箱地址和电话号码。所以应该加上主键以及细分联系方式。
2.2.2 第二范式
建立在第一范式的基础之上,要求所有非主键字段必须完全依赖主键,不要产生部分依赖。
上图不满足第二范式,比如第一行张三依赖1001编号,王老师依赖001编号,显然产生了部分依赖。造成了数据冗余,‘张三’和‘王老师’都重复了。
所以可以把以上表拆分为三个表来满足第二范式。
第二范式口诀:多对多使用三张表,关系表两个外键删表的时候也要先删除关系表再删两个表。
2.2.3 第三范式
第三范式建立在第二范式的基础之上,要求所有非主键字段必须直接依赖主键,不要产生传递依赖。
但是以上表不符合第三范式,比如一年一班依赖班级编号01,01依赖学生编号1001,产生了数据冗余,一年三班重复了。那应该怎么设计一对多?
第三范式一对多口诀:一对多,两张表,多的表加外键。