第5章 事务管理
目录
1 事务的基本概念
1.1 事务的概念
事务是一个操作序列,要么全做,要么全不做,是一个不可分割的操作单位
事务和程序是不同的,事务是一句或一组SQL语句,程序是很多事务
1.2 事务执行的状态
1.3 事务控制语句
-
开始:BEGIN TRANSACTION
-
提交:COMMIT TRANSACTION
- 事务正常结束,提交事务的所有操作,对数据的更新永久生效
-
回滚:ROLLBACK TRANSACTION
- 事务异常终止,撤销事务的所有操作,恢复到执行事务前的状态
1.4 事务的ACID特性
-
原子性Atomicity:事务操作全部完成或全部不做
-
一致性Consistency:事务执行的结果必须是从一个一致性状态到另一个一致性状态
-
隔离性Isolation:并发事务之间互不干扰
-
持久性Durability:保证已交付事务的结果不丢失,且与以后的故障无关
2 事务的并发执行与调度
2.1 并发执行
-
并发执行:在单CPU上利用分时方法运行多个事务(分时并发)
-
并行执行:在多CPU上的同时执行(同时并发)
2.2 潜在问题
-
丢失修改
- 事务1和2同时读入统一数据并修改,这样就导致事务1的修改被丢失
-
读“脏”数据
- 事务1的数据被事务2读了,但是事务1回滚了,事务2就不对了
-
不可重复读
- 事务1的两次读中,事务2修改了数据,使得两次不同
2.3 事务的调度
假设一个事务由多干的读操作和写操作组成
R(x) : 表示对数据X的读操作
W(x) : 表示对数据X的写操作
-
可串行化调度
冲突的:如果两个事务针对于同一数据项有写操作,那么这两个操作是冲突的(RW,WR,WW)
-
如果调度S通过一系列不冲突操作的交换而转换为调度S’,那么这两个调度是冲突等价的
-
如果一个调度S与一个串行调度是冲突等价的,那么S是冲突可串行化的
如下,S1是串行调度,S2是冲突可串行化的,S3不是冲突可串行化的
-
3 基于锁的并发控制
3.1 封锁概念
封锁是实现并发控制的重要技术
-
基本封锁类型
-
排它锁(X锁):T对A加X锁,T对A读写,其他事务不能对A上锁
-
共享锁(S锁):T对A加S锁,T对A只读,其他事物也能对A加S锁,但是不能加X锁
-
-
锁的状态
-
读锁
-
写锁
-
解锁
-
-
锁的操作
-
Slock A ( lock-S(A) )
-
Xlock A ( lock-X(A) )
-
Unlock A ( unlock(A) )
-
3.2 封锁协议
-
一级封锁协议:事务T在对A写操作前必须加X锁,直到事务结束释放
- 防止丢失修改
-
二级封锁协议:事务T在对A读操作前必须加S锁,读完后即可释放S锁
-
防止丢失修改
-
防止读脏数据
-
-
三级封锁协议:事务T在对A读操作前必须加S锁,直到事务结束释放
-
防止丢失修改
-
方式读脏数据
-
防止不可重复读
-
3.3 两段封锁协议
一个事务中所有加锁操作必须出现在第一个解锁操作之前
这样一个事务分为两个阶段:
-
扩展阶段:加锁但是不能解锁
-
收缩阶段:解锁但是不能加锁
3.4 死锁和饿死
-
死锁处理方式:
-
死锁预防:保证不仅如此死锁状态
-
一次性封锁法:每个事务必须一次将所有数据加锁,否则不能继续执行
-
顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实行封锁
-
-
死锁诊断与解除:可能会进入死锁时,使用机制解决
-
超时的方法:当等待时间大于规定时间,事务回滚(操作简单,但是可能误判死锁或不能及时发现死锁)
-
等待图法:绘制所有事务等待情况,如果有向图存在环那么存在死锁
-
-
死锁解除:
-
选择牺牲者
-
回滚
-
避免饿死
-
-
-
饿死:按照先后次序对事务排队,被选牺牲者的次数有限
4 数据库恢复
4.1 故障分类
内存中有系统缓冲区、每个事务有工作区,读写数据先从工作区到缓冲区,再到数据库
-
事务故障
-
系统故障:内存中系统缓冲区的信息全部丢失,已完成的事务操作结果可能没有写入磁盘(但是有日志)
-
介质故障
4.2 恢复的实现技术
-
基本原理:利用存储的荣誉数据来重建数据库中已被破坏或不正确的数据
-
基本方法:
-
实行数据转储:定时对数据库进行备份
-
静态转储与动态转储(从运行状态)
-
静态存储:无事务运行时转储
-
动态存储:与用户事务并发进行
-
-
海量转储与增量转储(从进行方式)
-
海量转储:每次转储全部数据库
-
增量转储:只转储上次转储后更新过的数据
-
-
转储策略:
-
每天晚上进行动态增量转储
-
每周进行一次动态海量转储
-
每月进行一次静态海量转储
-
-
-
建立日志文件:记录事务对数据库的更新操作,将数据库尽量恢复到最近状态
用来进行所有更新操作的文件
-
内容
-
事务标识、开始标记、结束标记
-
操作时间、操作类型(增删改)
-
操作目标数据、更改前及更改后的值
-
-
结构
- 逻辑上由若干条记录构成,但同一个事务的日志记录构成一个链表
-
先写日志规则:保证由缓冲区写入数据之前,要把相应的日志记录写入日志文件中
-
-
4.3 恢复策略
恢复主要操作:
-
事务撤销(UNDO)
-
事务重做(REDO)
-
事务故障的恢复
-
由恢复子系统利用日志文件撤销(UNDO)
-
自动完成,不需要用户干预
-
-
系统故障的恢复
- 依据日志文件UNDO未完成的事务,REDO已完成的事务
-
介质故障的恢复
-
装数据库,恢复到转储时的一致性状态
-
依据日志文件重做(REDO)已提交的事务需要DBA介入
-
4.4 提高恢复效率的技术
问题:
-
不知道回退多远
-
DBA必须周期性地转储数据库
-
检查点方法:DBMS在检查点将内存中的数据写回数据库并在日志中记录
-
系统检查点:周期性检查
-
事务检查点:用户在事务中设置的,要求系统记录事务的状态点
-
执行操作:
-
将内存中所有日志文件记录写入外存
-
将缓冲区所有更改过的快写入外存
-
在日志文件中记录检查点活跃的事务
-
-
恢复策略:
-
重做最近检查点以来提交的事务
-
撤销故障发生时活跃的事务
-
-
-
镜像技术(Mirror)
-
自动将整个数据库实时地复制到另一个磁盘
-
出现故障可以利用镜像恢复
-
没有故障可以支持并发操作
-