-
数据库设计三范式:
-
定义:设计数据库的时候所依据的规范,共有三个规范;
-
第一范式:要求有主键,数据库中不能出现重复记录,每一个字段是原子性不能再分;
-
第二范式:第二范式是建立在第一范式基础之上,要求数据库中所有非主键字段完全依赖主键,不能产生部份依赖;(严格意义上说:尽量不要使用联合主键)
-
第三范式:建立在第二范式基础之上,要求非主键字段不能产生传递依赖于主键字段;(典型的一对多的设计,在多的那张表中添加外键)
-
实际开发中应尽量遵循三范式.
-
根据实际需求进行取舍,有时可能会拿冗余换速度,最终的目的要满足客户需求
-
事务:
-
一个最小的不可再分的工作单元;
-
通常一个事物对应一个完整的业务;(如:银行转账业务)
-
而一个完整的业务需要批量的DML(insert、update、delete)语句共同完成;
-
事务只和DML语句有关系,或者说只有DML语句才有事务;
-
以上所描述的批量DML语句共有多少DML语句,这个和业务逻辑有关系,业务逻辑不同DML语句个数不同;
举个简单的银行转账业务来具体说明:
银行转账业务:是一个完整的业务,最小的单元,不可再分,也就是说银行转账业务是一个完整的事务。
-
以上两条DML语句必须同时成功或同时失败,因为它为最小业务单元,不可拆分;
-
当第一条DML语句执行成功之后,并不能将底层数据库中的第一个账户的数据修改,只是将操作记录了一下,这个记录是在内存中完成的.
-
当第二条DML语句执行成功之后,和底层数据库文件中的数据完成同步.
-
若第二条DML语句执行失败,将清空所有的历史操作记录. (也就是回滚)
-
结论:要完成以上功能,必须借助事务transaction
-
事务具有四个特性:
-
MySQL默认事务:自动提交 show variables like '%commit%';
-
在MySQL数据库管理系统中,默认情况下,事务是自动提交的;也就是说,只要执行一条DML语句,就开启了事务,并且提交了事务;
-
手动开启事务:start transaction;(相当于关闭了自动提交事务,须手动提交事务)
-
set autocommit = off;第二种关闭自动提交的方式
-
开启的标志:任何一条DML语句执行,标志事务的开启
-
事物的结束标志:commit或rollback
事物的隔离级别:
事务四个特性ACID之一:隔离性
隔离性有四个隔离级别:
-
read uncommitted 读未提交
-
read committed 读已提交
-
repeatable read 可重复读(为了解决不可重复读的现象)
-
serializable 串行化
-
查看当前会话隔离级别:select @@tx_isolation;(默认是repeatable read )
-
设置隔离级别:
-
read uncommitted 读未提交(级别最低)
-
事务A和事务B,事务A未提交的数据,事务B可以读取(这条数据本不应该查询到的)
-
这里读取到的数据可以叫做"脏数据"或"脏读Dirty Read"
-
读未提交隔离级别最低,这种级别一般只在理论上存在,数据库默认隔离级别一般都高于该隔离级别