ACID四大特性
- 原子性(Atomicity):事务被视为不可分割的最小单元,要么全部提交,要么全部失败回滚
- 一致性(Consistency):事务执行前后保持一致性,在一致性状态下,所有事务对一个数据的读取结果都是一致的.
- 隔离性(Isolation):一个事务所做的修改在提交前对所有其他事务都是不可见的.
- 持久性(Durability):一旦事务提交,则其所做的修改都将永远保存在数据库中.及时系统发生崩溃,事务执行的结果也不能丢失.通过数据库备份和恢复来保证持久性.
并发一致性问题
- 丢失修改:T1,T2两个事务都对同一份数据进行修改,后修改的T2会覆盖前面T1的操作
- 读脏数据:T1修改一个数据,T2随后读取,但T1撤销这次修改,那么T2读到的数据就是脏数据
- 不可重复读:T2读取一个数据,T1对这个数据做出修改,T2再次读取,两次读取的数据不同
- 幻影读(范围的不可重复读):T1读取范围数据,T2在这范围内修改数据,T1再读,两次读取数据不同.
封锁
- 行级锁
- 排它锁(X锁,写锁)
- 共享锁(S锁,读锁)
- 表级锁
- 意向锁:支持多粒度锁IX/IS
- 锁应该只锁需要并发的部分,锁的内容越少则并发程度越高.但加锁消耗资源,锁越多/封锁粒度越小,则开销越大
- 三级封锁协议
- 一级封锁协议:事务T需要修改数据必须加X锁,知道T结束才能释放(丢失修改问题)
- 二级封锁协议:一级 + 读取是必须加S锁,读完马上释放锁(脏读数据问题)
- 三级封锁协议:一级 + 读取是必须加S锁,事务结束才释放锁(不可重复读)
隔离级别
- 未提交读:事务的修改,即使没有提交也对其他事务是可见的
- 提交读:一个事务只能读取已经提交的事务的修改
- 可重复读:保证在同一事务中多次读取的结果都是一样的
- 可串行化:强制事务串行化执行
范式
- 第一范式:属性字段不可分割
- 第二范式:每个非主属性完全以来于键码,每张表只做一件事
- 第三范式:非主属性不传递依赖于键码,所有字段与主键直接相关
- BC范式:所有属性不传递依赖于键码
约束
- 键码:用于表示唯一实体
- 单值约束:某个属性是唯一的
- 引用完整性约束:一个实体属性引用的值必须在另一个实体中存在
- 域约束:某个属性的值在特定的范围内
- 一般约束:例如大小约束,数量约束