第5章 事务管理

第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)

    • 自动将整个数据库实时地复制到另一个磁盘

    • 出现故障可以利用镜像恢复

    • 没有故障可以支持并发操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值