FChao
发布于 2026-05-07 / 27 阅读
0
0

数据库系统工程师⑭:事务管理/锁/并发

一、2025真题

1.某银行账务系统中,对于转账事务而言,其原子性指的是();当转账事务执行成功后系统异常崩溃,经过重启,转账事务的修改结果依然存在,这体现了转账事务的()。

A.允许同时处理多个转账请求

B.转账金额必须为整数

C.转账操作必须全部成功或全部回滚

D.转账记录需永久保存

A.隔离性

B.原子性

C.一致性

D.持久性

ACID特性每年必考

2.在死锁的处理方法中,可以使用以下哪种方法打破环路等待条件()。

A.强制剥夺资源

B.占有全部资源才能开始

C.所有资源排序使用

D.假脱机

死锁产生的四个必要条件是:

  1. 互斥条件:资源不能被共享,一次只能由一个进程使用。如果其他进程申请该资源,必须等待直到资源被释放。

  2. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己已获得的资源保持不放。

  3. 不剥夺条件:进程已获得的资源,在未使用完之前不能被强行剥夺,只能在进程使用完后由自己释放。

  4. 环路等待条件:存在一个进程-资源的循环等待链,链中每个进程都在等待下一个进程所占有的资源。

要想打破环路等待,就让资源 “排序”。

要想打破不剥夺,就 “强制抢”。

要想打破请求保持,就 “一次全占”。

要想打破互斥,就用 “假脱机”。

3.以下4个选项中,不是死锁的必要条件的是?

A、不可剥夺条件

B、互斥条件

C、请求保持条件

D、链路条件

三、按知识点分类的往年题

并发调度图分析:

1.事务 T1、T2 和 T3 对相同的一组数据A、B 和C 进行操作,对于如下的一个并发调度,其中T1与T2间并发操作( 1 ),T2与T3间并发操作( 2 )。

请作答:第 1 题

A正确

B不能重复读

C将丢失修改

D将读“脏”数据

事务的并发操作破坏了事务的隔离性,带来的问题是数据的不一致性,主要有三类:

丢失更新/不可重复读/读脏数据

B不可重复读指的是:同一个事务中,两次读取同一条数据,得到的结果不一致(因为另一个事务在这期间修改并提交了这条数据)。

看到T1,两次T1 两次执行相同的计算 X1 = A + B + C,由于T2也在操作,得到的结果不同:明确写了验算不对。选B

C将丢失修改/更新:两个事务写同一个数据(如初值),其中一个覆盖了另一个

D将读“脏”数据:读了另一个事务还未提交的数据

A正确:一个并发调度是正确的 ⇄ 它是可串行化的:多个事务并发执行的结果,等于把它们按某种顺序串行执行的结果

请作答:第 2 题

将丢失修改,因为T3读B的时候T2还没有写入

事务T3通过B=60这个初值,修改B的值。最后覆盖写入。

这种情况丢失了事务T2对B的运算,将这种情况称之为“丢失修改”。

典型的情况是一个事务还没有写入,另一个事务就开始读取旧值了

并发作用/可串行化计算

3.数据库系统必须控制事务的并发执行,保证数据库 ( 3 ) 。假设事务 T1、T2分别对数据 A 和 B 进行的操作如下图所示,事务 T1 与 T2 间的并发调度为可串行化调度的是 ( 4 )。

请作答:第 3 题

A处于一致的状态

B不存在冗余的信息

C操作不出现死循环

D备份的完整性

请作答:第 4 题

判断一个并发调度是否可串行化,可以先看是不是存在丢失更新/不可重复读/读脏数据三种情况。如果有这三种情况之一,先排除选项。

再设一个初值,计算并行和串行结果来验证

A选项:

假设:

A = 1000,T1计算了A=1000-20=980,但是没有写入

T2计算得A=1000-1000*0.2=800,T2刚写入800这个值

T1又把它的980写入了,T2操作的这个A的值被覆盖了,属于丢失更新,排除此选项

再看到B,T2读B的时候,T1还没开始操作,等T1操作完了写回了,T2才开始根据旧值来运算,那么最终的写回还是会造成丢失更新。

选项B:

一方写入完了另一方才开始读,仔细观察,即使是并行,也是T1计算完了提交了才到T2,会发现这种情况恰好就是和串行等效的

而且没有重复读同一个数据,避免了不可重复读。

在考试的题目条件下,当题目明确标注了回滚(ROLLBACK),或者显式标出了提交点(COMMIT)时,才有可能出现脏读(一边的数据已经在提交后又回滚了,结果另一边读取了提交的值)

10.设有两个事务T1、T2有如下调度,产生的不一致性是( )。

丢失修改

一个事务还没有写入,另一个事务就已经读取旧值了

事务 T2 的修改覆盖了事务T1对A值的修改

11.12.系统中有三个事务T1、T2、T3分别对数据R1和R2进行操作,其中R1和R2的初值R1=120、R2=50。假设事务T1、T2、T3操作的情况如下图所示,图中T1与T2间并发操作( 11 ) 问题,T2与T3间并发操作( 12 ) 问题。

存在T1不能重复读的

T1两次读取之间T2提交了修改

存在T2丢失修改的

T3在T2提交修改之前读取了初值,并覆盖了T2修改的结果

16.17.事务T1读取数据A后,数据A又被事务T2所修改,事务T1再次读取数据A时,与第一次所读值不同。这种不一致性被称为( 不可重复读 ),其产生的原因是破坏了事务T1的( 隔离性 )。

30.31.如下图所示的并发调度,假设事务T 1、T 2执行前数据项X、Y的初值为X=100,Y=200。该调度执行完成后,X、Y的值为( 30 );此类不一致性称为( 31 ) 。

T1:X=100-30=70并且写入

T2:读取X=70 Y=200

T1:这里做的所有对Y操作都会被覆盖,跳过不用看

T2:Y=70+200=270并且写入

X= 70,Y=270

典型的T1被T2覆盖丢失修改

36.下图中两个事务的调度属于( 非可串行化调度 )。

这道题要特别小心和前面的一道题区分开来

在之前的这道题中,T1是算A到算B,T2也是算A到算B,而这道题里面对于B的计算是交错的。串行调度必须非交错地依次执行给定事务集合中的每一个事务的全部动作 。

保险起见,我们最好代入初值计算,假设 A、B 的初始值均为 100。

并发:

T1: A=100+100=200

T2: B=100*0.2=20

T1: B=20-100=-80

T2: A=200*0.3=60

两种串行顺序

T1 → T2:T1 做成 A=200、B=0 → T2 做成 A=60、B=0 → A=60,B=0

T2 → T1:T2 做成 A=30、B=20 → T1 做成 A=130、B=-80 → A=130,B=-80

非可串行化

38.数据库的并发操作可能带来的问题包括( 丢失修改

40.下表中两个事务的调度带来的问题是( 不可重复读 )。

41.为了防止一个事务的执行影响其他事务,应该采取( 并发控制

42.解决并发操作带来的数据不一致性一般采用( 封锁 )。

ACID事务/事务概念

5.6.事务提交(COMMIT)后,对数据库的更新操作可能还停留在服务器的磁盘缓冲区中,而未写入到磁盘,即使此时系统出现故障,事务的执行结果仍不会丢失,称为事务的 ( 持久性 )。为保证事务的此性质,需要利用数据库的 ( 日志文件 ) 。

8.一个事务的执行,不应该受到其他事务的干扰而影响其结果的正确性,称为事务的( 隔离性 )。

18.19.事务是一个操作序列,这些操作( 18 )。“当多个事务并发执行时,任何一个事务的更新操作直到其成功提交前的整个过程,对其他事务都是不可见的。”这一性质通常被称为事务的( 隔离性 )性质。

请作答:第 18 题 这里考察的是事务的原子性,不可分割

A

“可以做,也可以不做”,是数据库环境中可分割的逻辑工作单位

B

“可以只做其中的一部分”,是数据库环境中可分割的逻辑工作单位

C

“要么都做,要么都不做”,是数据库环境中可分割的逻辑工作单位

D

“要么都做,要么都不做”,是数据库环境中不可分割的逻辑工作单位

27.28.事务一旦提交,即使在写入数据库前数据尚在内存中而发生故障造成系统重启,该事务的执行结果也必须入数据库,该性质称为事务的( 持久性),为保证这一性质,必须使用( 日志 )。

29.事务有多种性质,“一旦事务成功提交,即使数据库崩溃,其对数据库的更新操作也将永久有效。”这一性质属于事务的( 持久性 )。

34.保证并发调度的可串行化,是为了确保事务的( 隔离性和一致性 )。

44.45.并发操作可能带来的数据不一致性有( 丢失修改、不可重复读、读脏数据 ),解决的办法是并发控制,主要技术是( 封锁

51.事务具有 ACID特性,其中C是指事务的( )。

A原子性(Atomicity)

B持续性(Durability)

C隔离性(Isolation)

D一致性 (Consistency)

53.原子性、一致性、持久性、(隔离性 )是数据库事务的四个特征。

54.以下关于数据库事务的叙述中,正确的是( )。

A一个数据库应用程序只能包含一个数据库事务

B一个数据库事务仅包含一条SQL语句

C一个数据库事务仅包含一个存储过程 存储过程只是事务里可能被调用的一部分

D一个数据库事务可以包含一组SQL语句

55.以下关于数据库事务的说法中,错误的是( )。

A 数据库事务是恢复和并发控制的基本单位

B 数据库事务必须由用户显式地定义

很多数据库默认把每条 SQL 当作一个隐式事务(自动提交)

C 数据库事务具有ACID特性

D COMMIT和ROLLBACK都代表数据库事务的结束

事务隔离级别/幻读

7.SQL-99标准规定的事务的四个隔离级别中,能解决幻影读现象的级别是 ( ) 。

A READ UNCOMMITTED

未授权读取:也叫读未提交,能看到其它事物没提交的修改

B READ COMMITTED

授权读取:也叫读已提交,只能看到其他事务已经提交的修改

这是大部分数据库默认的级别

C REPEATABLE READ

可重复读取:同一事务内多次读同一行,结果相同

(但是还是会有幻读)

D SERIALIZABLE

串行化:事务执行效果等同于串行执行

幻读是指同一事务内两次执行相同的范围查询,第二次结果中出现了新的行,不可重复读是数据的值变了,而幻读是结果集的行数变了

隔离级别 脏读 不可重复读 幻读 丢失修改

READ UNCOMMITTED ❌ ❌ ❌ ❌

READ COMMITTED ✅ ❌ ❌ ⚠️

REPEATABLE READ ✅ ✅ ❌ ⚠️

SERIALIZABLE ✅ ✅ ✅ ✅

20.事务 T1 中有两次查询学生表中的男生人数,在这两次查询执行中间,事务 T2 对学生表中加入了一条男生记录,导致 T1 两次查询的结果不一致,此类问题属于( 20 ),为解决这一问题,应采用的隔离级别是( 21 )。

请作答:第 20 题 这里要注意说的是多了一条表记录,不是数值变了

A可重复读

D幻影现象

21:Serializable

只有串行化能解决幻影问题

39.在数据库事务的四种隔离级别中,不能避免脏读的是( )。

Read uncommitted

ROLLBACK/COMMIT

9.关于ROLLBACK的描述,正确的是( )。

ROLLBACK语句会将事务对数据库的更新撤消

24.SQL中,用于提交和回滚事务的语句分别是( ) 。

COMMIT WORK和ROLLBACK WORK

37.在SQL中,通过使用 COMMIT和ROLLBACK语句可以结束事务。以下说法正确的是( )。

C某事务执行了 ROLLBACK语句,可将其对数据库的更新撤消

D某事务执行了 COMMIT语句,其影响可用 ROLLBACK语句来撤销

COMMIT 提交后是永久性的,不能再通过 ROLLBACK 撤销

43.用于提交和回滚事务的语句为( )。

COMMIT TRANSACTION 和 ROLLBACK TRANSACTION

两段锁

一定是统一先加锁后统一解锁,不可能是先加再解,再加,不能在释放后还去获取其他的锁。两段锁协议的最根本目的就是保证可串行化。但是放过来可串行化不代表能推出有两段锁协议。

13.以下关于事务调度的叙述中,错误的是( ) 。

A 串行调度是指一个事务执行完再执行下一个事务

B 可串行化调度是正确的调度

C 2PL能够保证可串行化调度

D 2PL能够保证不产生死锁

只能说明在单个事务里面不会发生死锁,但如果放在并发事务里面就有可能发生死锁了,会两边的事务互相等待对方解锁。

  • T1 请求执行 X(A) → 但 A 已经被 T2 用 S(A) 锁住了,T1 必须等待 T2 释放 A。但是释放锁都是统一在最后的。

  • T2 请求执行 X(B) → 但 B 已经被 T1 用 S(B) 锁住了,T2 必须等待 T1 释放 B。但是释放锁都是统一在最后的。

X锁和S锁

注意这里锁的兼容规则是针对不同事务之间的,我们在上图中已经看到同一个事务内,S 锁可以升级为 X 锁。

锁类型

读操作

写操作

其他事务的读锁

其他事务的写锁

S锁
(共享锁)

✅ 允许

❌ 不允许

✅ 允许

❌ 不允许

X锁
(排他锁)

✅ 允许

✅ 允许

❌ 不允许

❌ 不允许

X锁的具体作用是排他,其他事务不能对 R 加任何锁(既不能读也不能写),直到 T 释放 X锁

14.15.若事务 T1对数据 D1已加排他锁 ,事务 T2对数据 D2已加共享锁 ,那么事务 T2对数据 D1( 14 );事务 T1对数据 D2( 15 )。

14:加共享锁、排他锁都失败

D1已被加排他锁,除非T1自己释放,否则其他事务操作不了

15:加共享锁成功,加排他锁失败

D2具有的是共享锁,其他事务可以获得这个共享锁

22.23.假设系统中只有事务T1和T2,两个事务都要对数据D1和D2进行操作。若 T1对D1已加排他锁, T1 对D2已加共享锁;那么T2对D1( 22 ),那么T2对D2( 23 )。

和上一题没有任何区别

22:加共享锁、加排他锁都失败

23:加共享锁成功,加排他锁失败

32.并发执行的三个事务T1 、T2 和T3,事务T1 对数据 D1 加了共享锁,事务T2、 T3分别对数据 D2 、D3 加了排他锁,之后事务T1 对数据( 32 );事务T2对数据( 33 )。

D2 、D3 加排他锁和共享锁都失败

D1 加共享锁成功 ,D3 加排他锁失败

46.如果事务T获得了数据项R上的共享锁,则T对R( 只能读不能写

47.下面说法中错误的是( )。

A并发事务如果不加控制,可能会破坏事务的隔离性

B可串行化调度是正确的调度

C两段锁协议能够保证可串行化调度

D两段锁协议能够确保不会产生死锁

52.如果一个事务已获得数据项R上的共享锁,则其他事务( )。

可获得R上的共享锁

59.以下关于并发调度的说法中,正确的是( )。

A以不同串行方式调度执行两个事务,结果都相同 T1→T2 和 T2→T1 的最终值可能不同

B并发调度结果与某一种串行调度结果相同,是并发调度正确的必要条件

C不满足两段锁协议的并发调度,其结果一定是错误的 两段锁协议是充分条件,但不是必要条件。

D满足两段锁协议的并发调度不会产生死锁 两段锁不保证不死锁

增长和缩减阶段的概念

25.如下图所示的调度,其中事务T 1、T 2仅对数据项A、B进行操作,则该调度( 25 );假如该调度已经产生死锁,如果要从事务 T 1 、T 2中进行回滚以解除死锁,从代价最小的角度考虑,应回滚事务( 26 ) 。

图中只有加锁阶段,没有解锁阶段,貌似不符合两段锁协议

两段锁协议的本质要求是:

  1. 存在一个加锁阶段(只加锁,不解锁),也叫增长阶段

  2. 存在一个解锁阶段(只解锁,不加锁),也叫缩减阶段

  3. 这两个阶段严格分开,不能交织

当一个事务只加锁、从未解锁时,可以认为:

它的解锁阶段为空,即第二阶段长度为0。

死锁分析

  • T₁ 持有 X(B),想要锁X(A)

  • T₂ 持有 S(A),想要锁 S(B)

T₁ 想要 A 时,A 正被 T₂ 的 S(A) 锁着;
T₂ 想要 B 时,B 正被 T₁ 的 X(B) 锁着。

双方互相等待对方持有的锁,形成循环等待 → 必然发生死锁

26.T2只读取不写入,回滚代价小,应该回滚T2

35.满足两阶段封锁协议的调度一定是( )。

可串行化调度

封锁协议

48-50.事务T1将数据库中的A值从50改为30,事务T2读A值为30,事务T1又将刚才的操作撤销,A值恢复为50。这种情况属于( 读脏数据 ), 是由于数据库系统在( 并发控制 )方面的不当引起的,能解决此问题的方法是( 50 )。

请作答:第 50 题

A一级封锁协议和二级封锁协议

B二级封锁协议和三级封锁协议

C一级封锁协议和三级封锁协议

D一级封锁协议、二级封锁协议和三级封锁协议 一级不防脏读

封锁协议是实现隔离级别的一种手段

一级封锁协议 写前加 X 锁,事务结束释放

二级封锁协议 一级 + 读前加 S 锁,读完释放

三级封锁协议 二级 + S 锁保持到事务结束

  • READ UNCOMMITTED ≈ 一级封锁协议 只防止修改丢失

  • READ COMMITTED ≈ 二级封锁协议 修改丢失+脏读

  • REPEATABLE READ ≈ 三级封锁协议 修改丢失+脏读+不可重复读

56-58.下表是某两个事务并发执行时的调度过程,这里不会出现不可重复读的问题,是因为这两个事务都使用了( 56 );

两个事务的并行执行结果是正确的,是因为这两个事务都使用了( 57 );

在执行过程中没有发生死锁,这是因为( 58 )导致的。

请作答:第 56 题

三级封锁协议 (对应不可重复读

57:

两段锁协议 (对应可串行化,也就是并行结果正确

请作答:第 58 题

A排他锁

B共享锁

C两段锁协议

D偶然的调度

排除法,以上协议均不可能保证不死锁


评论