参考书:《数据库系统设计、实现与管理》(基础篇)(黑皮书)
并发控制
事务
transaction,事务是数据库的逻辑操作单位,一个执行可分为多个事务。允许数据库的⼀致性暂时遭到破坏,但是事务应该总是能够将数据库从⼀种⼀致的状态转换到另⼀种⼀致的状态。
两种结果:
- success->commit
- 已提交的不能撤销
- failure->abort撤销,数据库必须要还原到事务开始之前的⼀致的状态。
- aborte/undone/roll back
- 被撤销的事务可以⼀段时间后重启。
- partially commited:最后一条语句被执行后可能出现问题,处于部分提交状态,
关键词
begin transaction
commit
rollback
事务控制语句(TCL)
- COMMIT
- ROLLBACK
- SAVEPOINT
- SET TRANSACTION
特性
- 原子性atomicity
- 一致性consistency
- 隔离性isolation:事务的执⾏相互独立,未完成事务的中间结果对其他事务不可见。
- 持久性durability:已提交的不能撤销
并发控制
concurrency control
并发问题
- 更新丢失lost update problem
- 原因:覆盖替代overridden
- 解决:串行
- 未提交依赖uncommitted dependency
- 原因:允许⼀个事务看到另外⼀个未提交事的中间结果
- 不一致分析inconsistent analysis problem
- 原因:在A读的时候,B写
调度
- serial schedule:串行调度,按顺序执行,无交叉
- nonserial schedule:非串行调度,并发事务交叉执行
- serializable可串行化(冲突可串行)调度:交叉,但是产生结果和串行一样
- recoverable schedule可恢复性调度:读的提交在写的前面
可串行化
serializability
冲突条件
- 两项操作属于不同的事务
- 两项操作的对象是同一个数据项
- 至少有一个写操作
precedence/serialization graph 优先图/串行化图:用来检测调度是否为冲突可串行的。
- 直到write(x)结束才算是真正修改了x
- 事务提交不影响优先图边的存在
可恢复性
recoverability,若事务失败,要撤销事务对数据库造成的所有影响
并发控制技术
加锁
locking
- shared->read共享锁:事务只能读⽽不能修改该数据项。
- exclusive->write互斥锁
二段锁two-phase lockong(2PL)
事务中所有的加锁操作都出现在第⼀个解锁操作之前
- 如果每个事务都遵循⼆段锁协议,则该调度是冲突可串⾏的
- 级联回滚cascading rollback/级联终止cascading abort
- 解决:事务最后(提交)才允许释放所有锁。
死锁deadlock
两个(或多个)事务互相等待对⽅释放自⼰已经占有的锁时,产⽣的僵局
- 解决:
- 超时timeout:系统设置等待时间,超时则撤销并自动重启该事务
- 死锁预防deadlock prevention
- wait-die非抢占
- wound-wait抢占
- 死锁检测和恢复deadlock detection and recovery
- 构造等待图wait-for graph(WFG),有环则死锁
- 选择死锁牺牲者、事务回滚的程度、避免饿死
二段锁示例
- write_lock()
- read_lock()
- wait
- unlock
- 在事务commit后再释放锁
时间戳
timestamping,对事务全局排序,老事务优先级更高。通过回滚、重启,解决冲突
如果某事务企图读或写⼀个数据项,则只有当该数据项最近⼀次的修改是由⼀个较早的事务执⾏时,才允许该事务进⾏读或写。否则,请求读/ 写的事务将被赋予⼀个新的时间戳后重启。
示例
半期
ER
图书馆
- 组合属性
- 多元关系+属性
- 远主近宾
- assumption->假设0,1,*
技能培训学校
规范化
- 违反BCNF (A, B, C, D)
- B, C->D 决定方必须都为主键
- C, D->A
- 更新异常