🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀数据库💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
前言
概论
事务
并发控制
恢复系统
三者联系
练习题
题目一
题目二
题目三
题目四
题目五
题目六
题目七
题目八
总结
前言
前一讲我们进入了E-R模型设计以及E-R模型向关系模式转化。
那一讲的难点在于:1、如何确定三元关系(不是出现三个实体加联系就是三元关系);2、如何找到隐藏联系(有一些联系并不会直接说明,而是隐藏在生活常识中)
回顾一下:
E-R模型设计的流程:
1、确定E-R模型的最大整体(不出现在模型中)
2、确定E-R模型的实体集
3、确定E-R模型的联系集
4、确定E-R模型的属性集(实体和联系)
5、确定E-R模型实体/联系的主码
6、转化为关系模式
关系模式转化流程:
1、拿到E-R模型
2、将E-R模型中的实体和联系一一转化为关系模式(关系表)
3、根据合并原则将联系表格和实体表格合并
接下来,我们进入事务和两阶段封锁
概论
让我们先对事务、并发控制以及恢复系统有一个整体性的认识,然后再进入精选题的讲解。
事务
定义:事务是指一个逻辑上的一组操作,这些操作要么全部执行,要么全部不执行。事务的目的是保证数据库从一个一致性状态转换到另一个一致性状态
特性:
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
- 一致性(Consistency):事务开始前和结束后,数据库的状态必须是一致的。
- 隔离性(Isolation):一个事务的执行不应被其他事务干扰。
- 持久性(Durability):事务完成后,对数据库的更改是永久性的,系统崩溃也不会丢失。
并发控制
定义:并发控制是指在多用户环境下,保证多个事务同时执行时的正确性和一致性。它的主要目的是防止由于多个事务同时访问数据库而导致的数据不一致问题。
主要技术:
- 两阶段封锁:通过锁机制来控制并发访问。例如,读锁(共享锁)允许多个事务同时读数据,但不允许写;写锁(排他锁)则禁止其他事务读或写数据。
- 时间戳(Timestamping):给每个事务分配一个时间戳,通过比较时间戳来决定事务的执行顺序。
- 多版本并发控制(MVCC):维护数据的多个版本,使读操作不阻塞写操作,反之亦然。
恢复系统
定义:恢复系统是指在系统故障后,恢复数据库到一致性状态的机制。它保证数据库在发生崩溃、系统故障等情况下仍能保持数据的一致性和完整性。
主要技术:
- 日志(Logging):记录事务的所有操作,在发生故障时,可以通过日志来重做(Redo)或撤销(Undo)操作,恢复数据库。
- 检查点(Checkpointing):定期将数据库的当前状态保存到稳定存储中,减少恢复时需要处理的日志量。
- 影子页(Shadow Paging):通过页表来维护数据的多个副本,故障时可以使用影子页表来恢复数据。
三者联系
总的来说,数据库的事务必须保证:1、原子性;2、一致性;3、隔离性;4、持久性
并发控制和恢复系统就是为了保证事务的这四种性质而存在的
详细来看:
事务与并发控制:并发控制确保多个事务同时执行时不会互相干扰,从而维持数据库的一致性、隔离性
事务与恢复系统:事务的持久性要求一旦事务提交,其结果必须持久保存。恢复系统通过日志和其他技术确保即使在故障情况下也能恢复事务的结果,保证持久性、原子性
并发控制与恢复系统:并发控制机制确保事务执行期间的一致性,而恢复系统确保在系统崩溃后恢复到一致性状态。两者共同确保数据库在多用户环境下和发生故障时的一致性和完整性。
练习题
题目一
问题描述:
什么是事务?
问题解答:
事务是由一系列操作构成的程序执行单元,这些操作要么都做,要么都不做。事务具有原子性、一致性、隔离性和持久性,是不可分割的工作单元
题目二
问题描述:
请画出事务状态图,各种状态之间有什么联系?
问题解答:
题目三
问题描述:
事务的ACID特性分别是什么?每个特性的用途是什么?
问题解答:
- 原子性(Atomicity) 事务中包含的所有操作要么全做,要么全不做
- 一致性(Consistency) 事务的隔离执行必须保证数据库的一致性,即事务完成前后数据库是一致的
- 隔离性(Isolation) 系统必须保证事务不受其它并发执行事务的影响
- 持久性(Durability) 一个事务一旦提交之后,它对数据库的影响必须是永久的
题目四
问题描述:
下图所示的调度是冲突可串行化的吗?如果是冲突可串行化的,请给出等价的串行调度序列;如果不是,请说明原因。
问题解答:
冲突可串行化判断:画出优先图,看是否有环。如果有则不可串行化,否则可以通过拓扑排序写出串行序列
画出优先图如下:
由于T1、T3之间存在环,因此不可串行化
题目五
问题描述:
什么是两段锁协议?
问题解答:
为了保证可串行性,即实现事务的并发运行又保证事务的隔离性等特性,可以使用两阶段封锁实现并发控制。两阶段封锁协议要求每个事务分成两个阶段:增长阶段、缩减阶段。增长阶段事务只能获得锁不能释放锁;缩减阶段事务只能释放锁不能获得锁
题目六
问题描述:
死锁的发生是坏事还是好事?试说明理由。如何解除死锁状态?
问题解答:
一般来说,死锁状态本身是一件坏事,因为死锁将造成资源的浪费、数据库的死循环(业务中断)、数据不一致风险等;但是加入两阶段封锁协议导致的死锁不一定只是坏事,因为如果发生死锁说明在两阶段封锁协议下,这个事务并不是可串行化的,此时不发生死锁让事务任意并发的运行会导致数据不一致、读取脏数据等错误。从这个角度来说,出现死锁反倒是一种保护。
解除死锁状态包括:1、避免死锁;2、检测死锁;3、处理死锁
避免死锁:一次封锁法;顺序封锁法;抢占与事务回滚
检测死锁:超时法、等待图法
处理死锁:在出现死锁后,选择牺牲代价最小的那个事务作为牺牲者,将该事务执行回滚操作(全部回滚/部分回滚),从而解除死锁(这个处理死锁的方法可能出现饿死现象)
题目七
问题描述:
考虑以下调度,思考:
调度{TA,TB,TC}能够满足时间戳排序协议吗?
调度{TA,TB,TC}能够满足两阶段封锁协议吗?
调度{TA,TB,TC}冲突可串行化吗?
时间 | TA(TS=1) | TB(TS=2) | TC(TS=3) |
t1 | R(X) |
|
|
t2 | W(X) |
|
|
t3 |
| R(X) |
|
t4 |
| W(X) |
|
t5 |
|
| R(Y) |
t6 |
|
| W(Y) |
t7 | R(Y) |
|
|
t8 | W(Y) |
|
|
问题解答:
时间戳:
因此不能用时间戳实现并发控制
两阶段封锁协议:
因此不能用两阶段封锁实现并发控制
冲突可串行化:
因此可以串行化:Tc——Ta——Tb
题目八
问题描述:
什么是时间戳排序协议?
问题解答:
每个事务在开始时获得一个唯一的时间戳(时间戳的获得可以是计数器、也可以是系统时钟,这两者有各自的优缺点),根据这个时间戳对事务进行排序,排序的规则如下:
如果是读,则不能读未来事务写过的元组;如果是写,则不能写未来事务读过或写过的元组
经过这样排序的事务一定是可串行化的,并且没有死锁,但是可能存在饥饿,并且不保证可恢复性
总结
本文的所有知识点、图片均来自《数据库系统概念》(黑宝书)、山东大学李晖老师PPT。不可用于商业用途转发。