第22讲-数据库事务处理技术之并发控制

2200-第22讲本讲学习什么(1分45秒)及第22讲教学课件

2201-为什么要进行并发控制(8分56秒)

为什么要进行并发控制?

(1)数据库可能存在不一致

如果大家同时买起点终点、日期、 车次相同的车票,会否买到座位相重复的车票?

2202-深入认识事务(2个视频总计15分48秒)

深入认识事务(9分59秒)

(1)事务的概念

事务(Transaction)是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证。

(2)事务的宏观性和微观性

事务的宏观性 (应用程序员看到的事务):一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务。

事务一般是由应用程序员提出,因此有开始和结束,结束前需要提交或撤消。

Begin Transaction
exec sql ...
exec sql ..
exec sql commit work I exec sql rollback work
End Transaction

在嵌入式SQL程序中,任何一条数据库操纵语句(如 exec sql select 等)都会引发一个新事务的开 始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过 commit 或 rollback 确认的。 因此 Begin Transaction 和 End Transaction两行语句是不需要的。

事务的微观性(DBMS看到的事务):对数据库的一系列基本操作(读、写)的一个整体性执行。

T: read(A);
A:= A - 5000;
write(A);
read(B);
B:= B + 5000;
write(B);

事务的并发执行:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则可以是交叉执行的

事务ACID特性(5分49秒)

2203-事务调度与可串行性(3个视频总计22分39秒)

事务调度与可串行性(8分45秒)

注意:这里应该是并发调度,不是并行调度!

(2)一种简单的事务调度的标记模型

表达事务调度的一种模型

r_T(A): 事务T读A。 W_T(A) : 事务T写A

T1: r1(A); W1(A); r1(B); w1(B)

T2: r2(A); W2(A); r2(B); W2(B)

冲突可串行性(7分44秒)

冲突可串行性判别算法(6分10秒)

2204-基于锁的并发控制(3个视频总计30分57秒)

什么是锁(6分14秒)

基于封锁的并发控制方法

(2)什么是锁?

"锁" 是控制并发的一种手段

每一数据元素都有唯一的锁

每一事务读写数据元素前,要获得锁

如果被其他事务持有该元素的锁,则要等待。

事务处理完成后要释放锁

L_i(A): 事务T_i对数据元素A加锁

U_i(A): 事务T_i对数据元素A解锁

调度器可利用锁来保证冲突可串行性

锁本身并不能保证冲突可串行性。

锁为调度提供了控制的手段。但如何用锁,仍需说明。---不同的协议

封锁协议要考虑什么(13分57秒)

两段封锁协议(10分46秒)

2205-基于时间戳的并发控制(2个视频19分33秒)

基于时间戳的并发控制(10分40秒)

(2)什么是时间戳?

时间戳(TIMESTAMP)

一种基于时间的标志,将某一时刻转换成的一个数值。

时间戳具有唯一性和递增性。

事务的时间戳

事务T启动时,系统将该时刻赋予T,为T的时间戳

时间戳可以表征一系列事务执行的先后次序:时间戳小的事务先执行,时间戳大的事务后执行。

利用时间戳,可以不用锁来进行并发控制

核心思想:先执行的先操作,后执行的后操作,这样没有冲突

基于时间戳的另一种调度(8分53秒)

2206-基于有效性确认的并发控制(14分23秒)

能否进行批量性的冲突检测?

第22讲模拟练习题

13、T1,T2,T3三个事务,记wi(A)为事务Ti写数据对象A,ri(A)为事务Ti读数据对象A,一个调度S为 “w1(Y); w2(Y); w2(X); w1(X); w3(X);”,问该调度是S不是冲突可串行化调度,但却是可串行化调度,是正确的并行调度。

要判断给定的调度S是否是正确的并发调度以及是否是可串行调度,我们需要考虑事务之间的数据依赖关系和执行顺序。

首先,让我们逐步分析该调度:

  1. T1写入了数据对象Y(w1(Y))。
  2. T2写入了数据对象Y(w2(Y))。
  3. T2写入了数据对象X(w2(X))。
  4. T1写入了数据对象X(w1(X))。
  5. T3读取了数据对象X(r3(X))。

现在,让我们来分析一下:

正确的并发调度

  • 如果在该并发调度中,没有出现任何事务的读写冲突、写写冲突和不可重复读现象,则可以认为是一个正确的并发调度。

在给定的调度中,不存在两个事务同时访问相同的数据对象的情况,因此没有出现读写冲突或写写冲突。因此,这是一个正确的并发调度。

可串行调度

  • 如果该并发调度的执行结果与某个串行调度的执行结果相同,则称该并发调度是可串行的。

一个串行调度可以是w1(Y); w2(Y); w2(X); w1(X); w3(X)。在这个串行调度中,T1和T2的写操作按照其在调度S中的顺序执行,然后T3读取了X。调度S的执行结果与这个串行调度的执行结果相同,因此调度S是可串行的。

综上所述,给定的调度S是一个正确的并发调度,并且是可串行的。

这个调度S为:“w1(Y); w2(Y); w2(X); w1(X); w3(X);

首先,我们来看这个调度是否是正确的并发调度。一个正确的并发调度必须满足以下两个条件:

  1. 事务操作的顺序不变:在调度S中,事务的操作顺序是不变的,即按照w1(Y), w2(Y), w2(X), w1(X), w3(X)的顺序执行。

  2. 事务操作必须保证数据一致性:对于每个数据对象,如果事务Ti写入了一个数据项后,再有其他事务Tj读取或者写入该数据项时,Tj必须读取Ti的写入值。

对于第一个条件,调度S满足,因为事务操作的顺序没有改变。

对于第二个条件,我们来逐步分析:

  1. w1(Y):事务T1写入了数据对象Y。
  2. w2(Y):事务T2写入了数据对象Y。
  3. w2(X):事务T2写入了数据对象X。
  4. w1(X):事务T1写入了数据对象X。
  5. w3(X):事务T3写入了数据对象X。

接下来判断这个调度是否是可串行调度。一个可串行调度是指,存在一个等价的串行调度,该串行调度与原调度S的操作序列相同。因为可串行调度是串行调度的特例,因此我们只需要验证是否存在一个串行调度等价于原调度S即可。

根据原调度S的操作序列,可以构建一个串行调度为:T1 -> T2 -> T3,即按照事务T1、T2、T3的顺序执行操作。

26、关于基于时间戳的并发控制方法(简称TS方法)和基于有效性确认的并发控制方法(简称VA方法)的异同点,下列说法不正确的是___________。

  • A.TS方法和VA方法都是利用时间戳表征事务的启动时刻,表征事务的执行次序

  • B.TS方法和VA 方法都是为每一数据库元素保存一个读时间戳和写时间戳

  • C.TS方法是比较事务的时间戳与数据库元素的时间戳来判断是否有冲突,而VA方法是通过比较两个事务的读写数据集合是否有交集来判断是否有冲突

  • D.TS方法和VA方法都是以撤销事务并重启事务来解决事务之间的冲突

正确答案:B你选对了

解析:选项A、C和D的说法都是正确的,但选项B的说法是不正确的,TS方法是为每一数据库元素保存一个读时间戳和写时间戳,以便于事务时间戳与数据库元素的时间戳进行比较判断冲突;而VA方法则是为每一个事务保存一个读数据集合和一个写数据集合,以便于数据集合之间的比较判断冲突,故选项B的说法是不正确的。