一、事务概念
事务简单来说就是一组原子性的SQL查询,或者一个独立的工作单元,通常由一组SQL语句组成,如果其中任何一条语句因为崩溃或其他原因没有执行,那么所有的语句都不会执行。
二、事务特性(ACID)
1、原子性(Atomicity)
一个事务是数据库系统最小的工作单元,不可再分割,整个事务的所有操作要么全部提交执行成功,要么全部失败回滚,不可能只执行其中的一部分。
2、一致性(Consistency)
一致性指数据库总是从一个一致性的状态转换到另外一个一致性的状态。从原子性的角度来讲,一致性就是说要么数据库处于一个事务执行之前的状态,要么是其执行之后的状态,不可能处于事务执行中的状态。
3、隔离性(Isolation)
通常来说,一个事务所作修改在最终提交之前对其他事务都是不可见的。
4、持久性(Durability)
一旦事务提交,其所作修改就会永久保存到数据库中,即使系统崩溃或其他特殊原因,已修改的数据都不会改变。
三、数据库读写问题
1、脏读(Dirty Read)
事务可以读取未提交的数据,称为脏读。
2、不可重复度(Nonrepeatable Read)
执行两次同样的查询,可能会得到不一样的结果。
3、幻读(Phantom Read)
当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的纪录,当之前的事务再次读取该范围内的记录时就会产生幻行。
四、隔离级别
1、READ UNCOMMITTED(未提交读)
事务的修改即使没有提交,对其他事务都是可见的。
2、READ COMMITTED(提交读)
一个事务开始时,只能看见已提交事务所作的修改。
3、REPEATABLE READ(可重复读)
在同一个事务中多次读取同样的记录结果是一致的。
4、SERIALIZABLE(串行化)
强制事务串行执行来避免上述问题,在读取的每一行数据上都加锁,会产生大量超时和锁争用问题。
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITTED | YES | YES | YES | NO |
READ COMMITTED | NO | YES | YES | NO |
REPEATABLE READ | NO | NO | YES | NO |
SERIALIZABLE | NO | NO | NO | YES |
五、数据库范式
1、第一范式(1NF)
数据库表的每一列都是不可再分割的原子数据项。
2、第二范式(2NF)
在1NF的基础上,非码属性必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)。
不满足2NF可能产生的问题:数据冗余、更新异常、插入异常、删除异常
3、第三范式(3NF)
在2NF的基础上,任何非主属性不依赖于其他非主属性(消除传递依赖)。
不满足3NF可能产生的问题:数据冗余、更新异常
4、Boyce-Codd范式(BCBF范式)
在3NF的基础上,任何非主属性不能对主键子集依赖(消除对主码子集的依赖)