数据库第六章上课笔记。

事务

一组数据库操作序列集合,可以是一条SQL语句,也可以是一组SQL语句或者整个程序。事务是恢复和并发控制最小基本单位。

定义方式:

显式定义/隐式定义(DBMS):

begin transaction
SQL 语句1
SQL 语句2
······
commit

begin transaction
SQL 语句1
SQL 语句2
······
rollback
  • 事务结束:

    • commit正常结束
    • rollback异常结束(回滚)
  • 事务特性:

    • 原子性:事务中的操作要么全做,要么全不做

    • 一致性:只包含成功提交结果(commit/rollback)

      不一致就是包含失败的情况(既没有rollback也没commit)

    • 隔离性:一个事务不被并发执行的事务干扰

    • 持续性:事务提交后,对于数据的改变是永久性的

故障

  • 事务故障:某个事务在运行过程中未正常结束就终止

  • 系统故障:需要系统停止运转要求系统重新启动,计算机系统崩塌->数据库系统崩塌

  • 介质故障:磁盘故障

  • 计算机病毒:人为破坏

  • 恢复操作的基本原理:冗余,利用冗余数据重建数据库中已经破坏的部分

    • 数据转储:

      • 静态转储:复制、无运行事务的时候转储、一致性状态、不允许对数据库的任何存取修改活动。

      • 动态转储:和静态互补。不会影响用户和新事务运行,但是不能保证一致。可以在转储期间登记日志文件,转储结束后登记日志文件也转储。

      • 增量转储:只转储上次转储后更新过的数据

      • 海量转储:每次转储全部

        动态海量 动态增量
        静态海量 静态增量
    • 日志文件

​ 记录事务对数据库更新操作的文件。

​ 记录内容:各个事务的开始标记(begin transaction)、各个事务的结束标记(commit、 rollback)、各个事务的所有更新操作、与事务有关的内部更新操作。

​ 事务标识、操作类型、操作对象、更新之前的旧值、更新之后的新值

​ 日志文件格式:事务标识 操作类型 对象标识 前像 后像

  1. 事务A开始,日志记录(T,START...)

  2. 事务T修改对象A,(T,UPDATE,A,前像,后像)

  3. 事务T插入对象A,(T,INSERT,A, ,后像)

  4. 事务T删除对象A,(T,DELETE,A,前像, )

  5. 事务T提交,(T,COMMIT...)

  6. 事务T回滚,(T,ROLLBACK...)

    undo操作

    1. 对尚未结束的事务进行撤销(满足原子性)
    2. 旧值代替新值
    3. 反向扫描日志文件,找出只有begin transaction,无commit的记录

    redo操作

    1. 对已经提交的事务重做(因为commit/rollback并不会让他写到磁盘,还在内存)
    2. 正向扫描日志文件,根据日志文件中的操作次序,重新执行每项操作。

​ 登记日志文件的原则:

  1. 等级的次序严格按照并行事务执行的原则;
  2. 必须先写日志文件,后写数据库
    1. 写日志文件操作:把表示这个修改的日志记录写到日志文件
    2. 写数据库操作:把对数据的修改写到数据库中
  • 恢复策略:

    1. 事务故障的恢复:事务在运行至正常结束之前被终止

      恢复方法:由恢复子系统应利用日志文件撤销此事务对数据库的修改,反向扫描日志文件,将日志中更新前的数据写回到数据库中,直至事务的开始标志。

    2. 系统故障的恢复:整个os不能响应,有做完的有没做完的,分情况。

      恢复方法:正向扫描日志文件,redo队列:在故障发生前已经提交的事务,redo处理,对每个redo事务重新登记

      undo队列:故障前未完成的事务,undo处理,对每个undo事务的更新操作执行逆操作

    3. 介质故障的恢复:重装数据库,使得数据库恢复到一致性状态;利用日志文件重做已经完成的任务。

      1. 对于静态转出的数据库副本,装入后数据库即处于一致性状态
      2. 对于动态转出的数据库副本,还需要同时装入转出时刻的日志文件副本,利用与恢复系统故障相同的方法(undo、redo),才能把数据库恢复到一致性状态。
  • 具有检查点恢复技术

    • 搜索日志文件浪费时间
    • 重新执行redo很麻烦
    • 不要从开头找,从标记点开始找。插入一个检查点。检查点插入后,checkpoint,data缓冲区会写回到磁盘,这样就不要redo重来。
    • 定位最近的检查点:重新生成一个文件(重新开始文件),是记录检查点物理位置。
    • 插入检查点后,系统正常运行,要记住正在执行的事务清单,这些事务最近一个日志记录地址。
    • 检查点之前的事务,不管;正在的事务,按照结束位置选择是否放入redo(一开始都在undo,有commit的放入redo,之后redo+undo)

并发控制

多个事务执行方式:

    • 目的:并发执行,但是正确调度。保证数据库一致性,保证事务隔离性。

    • 封锁:对数据对象封锁。排他锁X写锁(只允许自己修改),共享锁S读锁(允许读不能修改)

    • 1级封锁协议:事务T在修改(对读操作没要求,所以限制不了脏数据和不可重复读)数据之前必须先加X,事务结束释放。没用丢失修改√

    • 2级封锁协议:1级封锁协议+事务在读数据之前要先加S锁,读完再释放。(不能保证可重复读)

    • 3级封锁协议:1级封锁协议+事务在读数据之前要先加S锁,事务结束再释放。

    • 读未提交

    • 读已提交

    • 可重复读

    • 可串行化

    • 活锁:某几个事务得不到资源。先来先服务。
    • 死锁:T1要T2,T2要T1;死锁是多个事务之间,最后僵持。
    • Ri(X)R_i(X) 表示事务TiT_i的读X操作
    • Wi(X)W_i(X)表示事务TiT_i的写X操作
    • 冲突操作:不同事务,同一数据单位,有一个写操作。
    • 调度集中在冲突操作!
    • 构造前趋图(事务是点,冲突操作画有向边,没环可串行)
    • 等价串行:拓扑排序
    • 两段锁协议:
      • 扩展阶段:获得封锁slock
      • 收缩阶段:释放封锁unlock
      • 并发执行的事务遵守两段锁,对这些事务的所有并发策略都是可串行化的。
      • 遵循3级封锁的一定遵循两段锁协议。

数据库安全性

  • 防止非法用户使用数据库,更改破坏。为保护数据库以防止非法使用。
  • 用户标识鉴定、DBMS、OS······
    • 用户登录界面
    • DBMS存取控制,SQL授权回收grant/revoke
    • 视图为不同的用户定义不同的视图
    • 数据加密(磁盘):数据库当中存在的数据是加密的
    • 审计:用户对数据库的操作放入审计日志。

数据库完整性

  • 定义:数据库的正确性和相容性

  • 安全性包含完整性

  • 完整性约束:

    • 列/元组/关系
    • 静态约束:确定状态
    • 动态约束:新旧值变化时

    静态列约束:一个列取值域的限制(NOT NULL/UNIQUE/默认值)

    静态元组约束:每行数值之间关系。工资(工资编号,基础工资,岗位津贴)岗位津贴小于基础工资。断言:谓词,用以检查数据库是否满足条件。create assertion limitconstraint check(not exists(select * from 工资 where 岗位津贴>基础工资));

    静态关系约束:关系中各个元组或者关系之间(实体完整性【主码】、参照完整【外码、关系与关系之间】)

    动态列

    动态元组

    动态关系

  • 触发器:DML/DDL;触发时间:before/after 触发对象:关系模式···

    create trigger trigger_name

    trigger_time

    trigger_event

    on tbl_name

    for each row #行级触发

    trigger_stmt;

delimiter$
create trigger t1
after insert on 订单
for each row
begin
	update 商品
	set 库存量=库存量-new.购买数量
	where 商品编号=new.商品编号;
end$
delimiter;#修改结束符号,分号容易混淆
#new表:插入数据
#old表:删除记录
  • 触发器作用:完成更复杂数据约束,检查sql语句是否被允许...
  • 用户/实体:拒绝执行
  • 参照:级联策略/置空策略