6.2数据库作业

文章目录

1

1.1

丢失更新(lost update)异常是指如果事务Tj读取了一个数据项,然后另一个事务Ti写该数据项(可能基于先前的读取),然后Tj写该数据项。于是Ti做的更新丢失了,因为Tj的更新覆盖了Ti写入的值。

给出一个表示丢失更新异常的调度实例。

R1(A)R2(A)W2(A)W1(A)

或者以表格的形式表示:
T1         T2
-----------------
Read(A)
          Read(A)
          Write(A)
Write(A)
在上面的调度中,事务T2写入的值由于事务T1的写入而丢失。

1.2

给出一个表示丢失更新异常的调度实例,表明在已提交读隔离性级别下该异常也可能存在。

T1         T2
-----------------
Lock-S(A)
Read(A)
unlock(A)
          Lock-X(A)
          Read(A)
          Write(A)
          unlock(A)
          commit
Lock-X(A)
Write(A)
unlock(A)
commit

上述调度中的封锁确保了已提交读隔离性的级别。但由事务T2写入的值因T1的写入而丢失。

1.3

解释为什么在可重复读隔离性级别下丢失更新异常不可能发生。
3、在可重复读取隔离级别,不会出现丢失更新异常。在可重复读取隔离级别中,事务T1读数据项X,在X上持有一个共享锁,直到事务结束。这使得较新的事务T2要等到T1结束才能够写X的值。这就强制成串行顺序T1、T2,因此T2所写的值不会丢失。

2

2.1

考虑下面两个事务:
T1:read(A)      
    read(B)
    if A=O then B:=B+1
    write(B)

T2:read(B)
    read(A)
    if B=O then A:=A+1
    write(A)


给事务T1与T2增加加锁、解锁指令,使它们遵从两阶段封锁协议。

T1:lock-S(A)      
    read(A) 
    lock-X(B)     
    read(B)
    if A=O then B:=B+1
    write(B)
    unlock(A)     
    unlock(B)     

T2:lock-S(B)      
    read(B) 
    lock-X(A)     
    read(A)
    if B=O then A:=A+1
    write(A)
    unlock(B)     
unlock(A)

2.2

这两个事务会引起死锁吗?

行这些事务可能导致死锁。例如,考虑以下调度:
T1         T2
-----------------
Lock-S(A)
Read(A)
          Lock-S(B)
          Read(B)
Lock-X(B)
          Lock-X(A)

此时调度出现了死锁。

3

3.1

考虑下面两个事务:
T1:read(A)      
    read(B)
    if A=O then B:=B+1
    write(B)

T2:read(B)
    read(A)
    if B=O then A:=A+1
    write(A)
 
设一致性需求为A=0 ∨ B=0,初值是A=B=0。

说明包括这两个事务的每一个串行执行都保持数据库的一致性。

T1与T2有2种可能的串行调度:T1、T2,或者T2、T1。

对于调度T1、T2,调度结束时,A=0,B=1

对于调度T2、T1,调度结束时,A=1,B=0

可以看出串行执行会生成两种不同的结果,但都保持了数据库的一致性。

3.2

设一致性需求为A=0 ∨ B=0,初值是A=B=0。

给出T1和T2的一次并发执行,执行产生不可串行化调度。

T1和T2的如下并发执行,将产生不可串行化调度:
T1                 T2
----------------------------
Read(A)
                   Read(B)
                   Read(A)
Read(B)
if A=O then B:=B+1
                   if B=O then A:=A+1
                   Write(A)
Write(B)

3.3

存在产生可串行化调度的T1和T2的并发执行吗?
没有导致可串行化调度的并行执行。

从第a部分我们知道,一个可串行调度的结果是a = 0∨

B = 0。假设我们从T13开始读(A)。那么当日程安排

结束,无论何时运行T2 B = 1。现在假设

我们在T13完成之前开始执行T14。然后T2读(B)

B的值为0。当T2结束时,A= 1。因此B = 1∧A

= 1→?(A = 0∨B = 0),类似于从T14开始读(B)。

4

什么是可恢复调度?
假设在一个调度中,Tj读取了Ti写入的数据,Ti在提交前发生故障,我们必须中止Tj以保证事务地原子性。若Tj在Ti出现故障后是可中止的,那么我们就称该调度是可恢复调度。

可恢复调度应满足:对于每个事务Ti和Tj,如果Tj读取了由Ti所写的数据项,则Ti先于Tj提交。

相关推荐
阿华的代码王国8 分钟前
【JavaEE】——多线程(join阻塞,计算,引用,状态)
java·开发语言·数据结构·java-ee
激动的兔子9 分钟前
mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题
数据库·mysql·mariadb
江喜原13 分钟前
微服务下设计一个注解标识是否需要登录
java·微服务·架构·登录
ABin-阿斌20 分钟前
SpringBoot 整合 Easy_Trans 实现翻译的具体介绍
java·spring boot·后端
边疆.20 分钟前
数据结构:内部排序
c语言·开发语言·数据结构·算法·排序算法
菜鸟求带飞_22 分钟前
算法打卡:第十一章 图论part03
java·数据结构·算法·深度优先·图论
圆头圆脑圆JAVA22 分钟前
简单了解微服务--黑马(在更)
java·spring boot·微服务
Mr数据杨23 分钟前
练习题 - Django 4.x Overviewses 框架概述
数据库·sqlite
木子欢儿30 分钟前
在 Debian 12 上安装 Java 21
java·运维·开发语言·debian
一二小选手33 分钟前
【高级编程】XML DOM4J解析XML文件(含案例)
xml·java