软考-中级数据库系统分析师-07 事务
2023-05-14
事务概念
定义:事务是一系列的数据库操作,是数据库应用程序的逻辑单位。要么都做,要么都不做。
语句:
begin transaction
end transaction
commit / commit work
rollback / rollback work
事务特性
- 原子性
- 一致性
- 隔离性:两个事务对同一个数据进行操作,不会相互干扰
- 持久性:存在磁盘上,不是存在内存中
事务的状态
- 活动状态
- 部分提交
- 提交状态
- 失败状态
- 中止状态
并发控制(重要)
事务调度
- 串行调度
- 并发调度:利用分时的方法同时处理多个事务
- 可恢复调度:当事务A要读事务B写的数据时,B事务必须要先于事务A提交
并发调度是否正确:结果和任意一次串性执行结果一致即可,则可以认为是可串行化的调度。可串行性是并发事务正确性的准则。
并发操作的不一致性:
- 丢失修改
- 不可重复读
- 读脏数据:读取的是其他事务修改后的值,但是该修改后来又被撤销了
并发控制技术
- 排它锁(X锁):其他事务无法进行读或写
- 共享锁(S锁,读锁):其他事务可以读,不能写
封锁协议
- 一级封锁协议:修改前加X锁,解决丢失修改问题
- 二级封锁协议:一级协议基础上加上读之前加S锁,读完释放S锁。解决读脏数据的问题
- 三级封锁协议:一级协议基础上加上读之前加S锁,事务结束才释放S锁。解决不可重复读的问题
两段锁协议(2PL)
定义:同一事务对任何数据进行读写之前必须对该数据加锁,在释放一个封锁之后,该事务不再申请和获得任何其他封锁。第一阶段获得封锁,即扩展阶段;第二阶段是释放封锁,即收缩阶段。(含义要背下来!)
特点:
- 遵循两段锁,一定是可串行化的;不遵循两段锁,可能是可串行化,可能不是
- 采用两段锁协议可能产生死锁
事务的隔离级别
- READ UNCOMMITED 读未提交 避免丢失修改
- READ COMMITED 读已提交 避免丢失修改、读脏数据
- REPETABLE READ 可重复读 避免丢失修改、读脏数据、不可重复读
- SERIALIZABLE 串行化 最高级别,避免丢失修改、读脏数据、不可重复读、幻读
幻读:事务A查询到N条数据,然后事务B又插入M条数据,导致事务A再次搜索发现有N+M条数据,产生幻读(与不可重复读区别,幻读是第二次读取到更多条数据,脏数据是同一个数据值变了)
数据库备份与恢复
故障种类
- 事务故障:由于程序执行错误引起事务异常终止
- 逻辑错误
- 系统错误:如死锁
- 系统故障:硬件故障,未破坏存储在外存上的信息
- 介质故障:存储介质发生故障,如磁盘损坏,会直接破坏数据库
数据库备份
- 静态转储、动态转储:静态在转储期间不能进行任何存取、修改操作
- 海量转储、增量转储
- 日志文件
- 数据库镜像
数据库恢复
要能够恢复,必须建立冗余数据。
恢复操作:
- 撤销undo:将未完成的事务撤销,使数据库恢复到事务执行前的正确状态。通过反向扫描日志文件,进行逆操作,直至事务开始标志
- 重做数据redo:正向扫描日志文件,重新执行,直至事务结束标志
恢复策略:
- 事务故障的恢复(在运行到正常终止点commit或rollback前终止):undo。是由系统自动完成,对用户透明
- 系统故障的恢复,包括未完成事务已经写入数据库(undo),或者已提交的事务还没写入数据库(redo)
- 介质故障:重装数据库,装载最近一次的备份和日志文件副本,再undoundo+redo
检查点机制 checkpoint
反向扫描日志文件,找到检查点。对于检查点后提交的事务,执行redo;对于检查点后未提交的事务,执行undo