数据库三范式、事务

三范式

第一范式(1NF)

  在一张表中,组成表的每一个属性都是不能再分的属性,如果满足这一规则,则该表符合第一范式。

                        

                     表1(不符合)                                                    表2(符合)

  表1的Info字段可以再拆分,故不符合1NF;表2所有属性不可再分,符合。

第二范式(2NF)

  首先要满足1NF,表中的每一个非主属性必须完全依赖于本表的主键(候选键),而不能是部分依赖。

                      

            表1                             表2

  表1中,学号和课程为联合主键,由于姓名属性只依赖于学号,学分只依赖于课程,故不满足2NF;表2中,选修时间及成绩都完全依赖于主键,故符合2NF。由此也可知不满足2NF的情况只会出现在有联合主键的表中。

第三范式(3NF)

  首先满足1NF和2NF,另外所有非主属性都是与主键直接相关,而不能是间接相关

                

                            表1

  表1中,客户名称与订单号并不是直接相关,而是可以通过客户号与订单号间接相关,故不满足3NF

五大约束

  1、 Primary key:主键约束

  2、 UNIQUE:唯一性约束

  3、 NOT NULL:非空约束

  4、 Foreign key:外键约束

  5、 Default:默认值约束

事务

四大特性(ACID)

  1、 原子性(atomicity):一个事务是不可分割的,所以要么执行其全部内容,要么就根本不执行。如果一个事务开始执行,但是由于某些原因失败了,则事务对数据库造成的任何可能的修改都要撤销。

  2、 一致性(consistency):一个事务作为原子从一个一致的数据库状态开始独立运行,则事务结束时数据库也必须是再次是一致的。比如,在转账之前 A + B = 500,那么在转账之后也应是A + B = 500。

  3、 隔离性(isolation):多个并发执行的事务间互不干扰。

  4、 持久性(durability):事务一旦提交,数据库中的数据的改变是永久的,即使数据库出现故障。

三读

  1、 脏读:两个并发事务,事务T2读取了事务T1未提交的数据。如下图,事务T1尚未提交,这时事务T2进来读取了x的值,但是事务T1最终可能不提交而是进行了回滚,这样T2就读取了无效的x。

        

  2、 不可重复读:在事务内存在多次读取某变量的操作,但是前后读取的值不一样。如下图,事务T2存在两次读取x的操作,但是有可能在第一次读取完的时候,T1事务执行把x值修改,T2再次读取x的值就与第一次读取的结果不一样。

       

  3、 幻读:在某个事务内前后执行了相同的操作(如查询结果集),但得到的结果集不一样。如下图,T1在T2执行的过程中进行了插入操作,导致T2前后查询结果不一致。

       

事务隔离性级别

  1、 可串行化(serializable):最高隔离级别,通常保证可串行化调度,可避免脏读、不可重复读和幻读的发生。读时加表级共享锁,事务结束释放;更新时加表级排他锁,事务结束后释放。

  2、 可重复读(repeatable read):可避免脏读、不可重复读。读时加行级共享锁,直到事务结束释放;更新时加排他锁,直到事务结束后释放。(mysql默认隔离级别)

  3、 已提交读(read committed):可避免脏读。读时加行级共享锁,读完释放;更新时加行级排他锁,事务结束后释放。

  4、 未提交读(read uncommitted):最低隔离级别,允许读取未提交数据。更新时加排他锁,更新完释放。

原文地址:https://www.cnblogs.com/X-huang/p/10952761.html