(一)事务管理
事务是一个操作序列,这些操作“要么都做,要么都不做”,是数据库环境中不可分割的逻辑工作单位。
在SQL
语言中,事务定义的语句有以下三条:
- 事务开始(
BEGIN TRANSACTION
) - 事务提交(
COMMIT
)
该操作表示事务成功地结束,它将通知事务管理器该事务的所有更新操作现在被提交或永久地保留。 - 事务回滚(
ROLLBACK
)
该操作表示事务非成功地结束,它将通知事务管理器出故障了,数据库可能处于不一致状态,该事务的所有更新操作必须回滚或撤销。
事务具有的四个特性(也称为ACID
性质):
- 原子性(
Atomicity
)
事务是原子的,要么都做,要么都不做。 - 一致性(
Consistency
)
事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态。因此,当数据库只包含成功事务提交的结果时,称数据库处于一致性状态。 - 隔离性(
Isolation
)
事务相互隔离。当多个事务并发执行时,任一事务的更新操作直到成功提交的整个过程,对其他事务都是不可见的。 - 持久性(
Durability
)
一旦事务提交成功,即使数据库崩溃,其对数据库的更新操作也将永久有效。
(二)数据库的备份与恢复
1. 故障类型
数据库的四类故障包括:
- 事务内部故障
- 系统故障
- 介质故障
- 计算机病毒
2. 备份方法
恢复的基本原理是“建立书籍冗余”(重复存储)。建立冗余数据的方法是进行数据转储和登记日志文件。
数据的转储分为:
- 静态转储和动态转储
静态转储是指在转储期间不允许对数据库进行任何存取、修改操作;
动态转储是在转储期间允许对数据库进行存取、修改操作。
因此,转储和用户事务可并发执行。 - 海量转储和增量转储
海量转储是指每次转储全部数据;增量转储是指每次只转储上次转储后更新过的数据。 - 日志文件
在事务处理的过程中,DBMS
把事务开始、事务结束以及对数据库的插入、删除和修改的每一次操作写入日志文件。一旦发生故障,DBMS
的恢复子系统利用日志文件撤销事务对数据库的改变,回退到事务的初始状态。因此,DBMS
利用日志文件来进行事务故障恢复和系统故障恢复,并可协助后备副本进行介质故障恢复。
3. 恢复
事务恢复的三个步骤:
- 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。
- 对事务的更新操作执行逆操作。
- 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。
4. 数据库镜像
为了避免磁盘介质出现故障影响数据库的可用性,许多DBMS
提供数据库镜像功能用于数据库恢复。
数据库镜像是通过复制数据实现的,但频繁地复制数据会降低系统的运行效率。因此,在实际应用中往往对关键的数据和日志文件镜像。
(三)并发控制
并发操作是指在多用户共享的系统中许多用户可能同时对同一数据进行操作。
1. 并发操作带来的问题
带来的问题:
- 丢失修改
- 不可重复读
- 读脏数据
其主要原因是事务的并发操作破坏了事务的隔离性。
2. 并发控制技术
并发控制的主要技术是封锁。基本封锁的类型有排它锁(简称X
锁或写锁)和共享锁(简称S
锁或读锁)。
(1)封锁
- 排他锁
若事务T
对数据对象A
加上X
锁,则只允许T
读取和修改A
,其他事务都不能再对A
加任何类型的锁,直到T
释放A
上的锁。 - 共享锁
若事务T
对数据对象A
加上S
锁,则只允许T
读取A
,但不能修改A
,其他事务都不能再对A
加S
锁,直到T
释放A
上的S
锁。
(2)三级封锁协议
- 一级封锁协议
事务在修改数据R
之前必须先对其加X
锁,直到事务结束才释放。
事务结束包括正常结束(COMMIT
)和非正常结束(ROLLBACK
)。
一级封锁协议可以解决丢失更新问题。 - 二级封锁协议
在一级封锁协议的基础上,加上事务T
在读数据R
之前必须先对其加S
锁,读完后即可释放S
锁。二级封锁协议可以解决读脏数据的问题。但是,由于二级封锁协议读完了数据后即可释放S
锁,所以不能保证可重复读。 - 三级封锁协议
在一级封锁协议的基础上,加上事务T
在读数据R
之前必须先对其加S
锁,直到事务结束时释放S
锁。三级封锁协议除了防止丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
3. 活锁与死锁
活锁: 是指当事务T₁
封锁了数据R
时,事务T₂
请求封锁数据R
,于是T₂
等待,当T₁
释放了R
上的封锁后,系统首先批准了T₃
请求,于是T₂
仍等待,当T₃
释放了R
上的封锁后,又批准了T₄
请求,依此类推,使得T₂
可能永远等待的现象。
死锁: 是指两个以上的事务分别请求封锁对方已经封锁的数据,导致了长期等待而无法继续运行下去的现象。
4. 并发调度的可串行性
多个事务的并发执行是正确的,当且仅当其结果与某一次序串行地执行它们时的结果相同,称这种调度策略是可串行化的调度。
可串行性是并发事务正确性的准则,按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的才认为是正确调度。
5. 两段封锁协议
所谓两端封锁协议,是指所有事务必须分两个阶段对数据项加锁和解锁。
事务分两个阶段:
- 第一阶段是获得封锁,事务可以获得任何数据项上的任何类型的锁,但不能释放;
- 第二阶段是释放封锁,事务可以释放任何数据项上的任何类型的锁,但不能申请。
6. 封锁的粒度
封锁对象的大小称为封锁的粒度。
封锁的对象可以是逻辑单元(属性、元组、关系、索引项、整个索引甚至整个数据库),也可以shi
网友评论