55
1 第第第 第第第第第第

第七章 分布式数据库

Embed Size (px)

DESCRIPTION

第七章 分布式数据库. 7.4 分布式事务管理 事务( Transaction): 一组对数据的操作序列称为事务。 事务的性质或称 ACID 准则: 原子性( Atomic) 一个事务要么全执行,要么全不执行。 一致性( Consistency) 指数据应满足的约束条件。 隔离性( Isolation) 事务更新过的数据在事务结束前对其他事务不可见。 持久性( Durability) 已完成事务对数据的更新应持久,发生故障应恢复。. 分布式事务管理:分布事务管理和局部事务管理 - PowerPoint PPT Presentation

Citation preview

Page 1: 第七章  分布式数据库

1

第七章 分布式数据库

Page 2: 第七章  分布式数据库

2

7.4 分布式事务管理事务( Transaction ): 一组对数据的操作序列称为事务。事务的性质或称 ACID 准则:(1)原子性 (Atomic) 一个事务要么全执行,要么全不执行。(2) 一致性 (Consistency) 指数据应满足的约束条件。(3)隔离性 (Isolation) 事务更新过的数据在事务结束前对其他事务不可见。(4)持久性 (Durability) 已完成事务对数据的更新应持久,发生故障应恢复。

Page 3: 第七章  分布式数据库

3

分布式事务管理:分布事务管理和局部事务管理 一个分布式事务由主事务(负责事务的开始、提交或异

常中终止)和多个子事务(完成对数据的操作)组成。 分布式事务管理程序:事务处理和协调程序二部分组

成。

分布式事务处理:分布式并发控制和事务恢复

Page 4: 第七章  分布式数据库

4

7.4.1 分布式事务的并发控制 7.4.1.1 分布式事务可串行化 如果多个事务并行调度执行结果与他们按某一串行执行的结果相同,称这些事务的调度执行是可串行化的。

例:事务 T1 、 T2 分别对数据 A 和 B 执行更新。 T1: READ A T2: READ B

A = A - 10 B = B - 20 WRITE A Y = B READ B WRITE B B = B + 50 READ A WRITE B C = Y + A WRITE C

初 始 值 为A=50 , B=l00 。T1 先执行结果为 : A=40 , B=130 , C=170。T2 先执行结果为 : A=40 , B=130 , C=130。

Page 5: 第七章  分布式数据库

执行结果为 : 执行结果为 : A=40 , B=150 , C=120 。A=40 , B=130 , C=170.

T1: READ A T2: READ B A = A - 10 B = B - 20 WRITE A Y = B READ B WRITE B B = B + 50 READ A WRITE B C= Y + A WRITE C

初始值为 : A=50 , B=l00 。

T1: READ A T2: READ B A = A - 10 B = B - 20 WRITE A WRITE B READ B B = B + 50 READ A WRITE B READ B C = A + B WRITE C

Page 6: 第七章  分布式数据库

6

调度: 指事务处理执行操作的一个序列。 事务的操作分为两类: Ri(x) 、 Wi(x)串行调度序列 S1 : R j (x)Wj (y)R i (x)Wi (x)R k (y)

冲突操作: 若二个事务同时对数据目标 X 操作,其中之 一是写操作,则这二个操作是冲突的。并行调度序列 S2 : Ri(x) Rj(x)Wi(x) Wj(y)Rk(y)      

冲突等价: 同一个事务集的不同调度序列中,任一对冲 突操作在调度 S1 中 Oi 优先 Oj 而在调度 S2 中也 Oi 优先 Oj, 则这两个调度冲突等价。 S1 和 S2 是冲突等价的: 冲突操作 <Rj(x),Wi (x)> 和 <Wj(y),Rk (y)> 在 S1 和 S2 中的顺序一致。

Page 7: 第七章  分布式数据库

7

分布式事务: 由一个主事务和多个子事务组成。分布式事务的可串行化: 设分布事务集 T1,T2,,Tk ,如果满足以下条件,则 T1,T2,,Tk 的调度执行是可串行化的 .

(1) .对分布事务 T1,T2,,Tk 的每个局部结点上的调度Sp 都是可串行化的; (2) 存在一个对 T1,T2,,Tk 的综合顺序使得在该顺序中事务 Ti<Tj ,则对 T1,T2,,Tk 每个局部结点上的可串行化调度 Sp 在等价的串行调度 Sp 中有事务 Ti<Tj 。

Page 8: 第七章  分布式数据库

8

例:设数据 X 在结点 1 , Y 在结点 2

事务 T1: R1(x)W1(x)R1(y)W1(y)

T2: R2(x)W2(x)R2(y)W2(y)

存在综合调度: T1 < T2 或 T2 < T1

在结点1的调度: R1(x) W1(x) R2(x) W2(x)

在结点2的调度: R 1 (y) W1(y) R2(y) W2(y)在结点2的调度: R2(y) W2(y) R 1 (y) W1(y)

Page 9: 第七章  分布式数据库

9

7.4.1.2 基于封锁的并发控制 封锁的类型(共享锁 S 、排它锁X )、 封锁的时间、封锁协议 封锁协议( Locking Protocol )

使用锁的规则 封锁协议的内容包括有,何时申请锁、锁的类型、持锁时间、何时释放锁。事务 T 在修改数据 R 之前必须先对 R 加 X锁,在读取数据 R 之前必须先对其加锁,直到事务结束才释放锁。

Page 10: 第七章  分布式数据库

10

为了保证数据库的一致性, DBMS 需要提供并发控制机制,以保证并发操作的正确性。

并发操作不当带来的数据不一致性的表现 丢失修改 不可重复读 读“脏”数据

T1

T2

A=16 A=A-1

A=16 A=A-1

T1

T2

A=6 B=5 A+B=11 A=6 B=10 A+B=16

B=B+5

T1

T2

B=5 B=B*6 ROLLBACK

B=30

Page 11: 第七章  分布式数据库

11

第一阶段是获得封锁,也称为扩展阶段。在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。 第二阶段是释放封锁,也称为收缩阶段。在这阶段,事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。

开始 上锁 释放锁 结束

二段锁协议 (Two-Puase Looking 2PL 协议 ) (1). 任何事务在对数据操作前必须先获得锁; (2). 事务在释放一个锁后不再获得任何锁。

Page 12: 第七章  分布式数据库

12

    若所有事务都遵循 2PL 协议,则多个事务的交叉执行是可串行化的。

在分布式数据库中,若所有事务都遵循 2PL ,则分布事务的调度执行是可串行化的。假定不存在可串行化的调度,即对 T1,T2,…,Tk 事务不存在分布式事务的综合顺序,则一定存在一个冲突回路:

〈 O1(x),O2(x) 〉 , 〈 O2(y),O3(y) 〉 ,…,

〈 Ok(z),O1(z) 〉

但每个事务若遵循二段锁协议,以上调度序列是不会产生的。

Page 13: 第七章  分布式数据库

13

  例 : 结点 A( 数据 X) 结点 B( 数据 y)

T1: R(x)W(x)

T2: R(x)W(x)

T1: R(y)W(y)

T2: R(y)W(x)

并行调度的综合顺序 : T1<T2

结点 A : R1(x)W1(x) R2(x)W2(x)

结点 B : R1(y)W1(y) R2(y)W2(y)

Page 14: 第七章  分布式数据库

14

  死锁检测和消除 :

T1A

T2A

T1B

T2B

  局部等待图

结点 A

T1A(X)

T2A(X)

T1B(Y)

T2B(Y)

  全局 等待图

结点 A 结点 B

并行调度的顺序 : T1<T2

T1 : R1(y)W1(y) R1(x)W1(x)

T2 : R2(x)W2(x) R2(y)W2(y) 执行2PL

Page 15: 第七章  分布式数据库

15

 

NLDD0

  NLDD1 NLDD2

 

LDD1 LDD2 LDD3 LDD4 LDD5

死锁检测器树

分布式数据库中死锁的检测 集中式死锁检测 、分层控制:与层次选择有关,应反映网络拓扑结构和对结点的访问模式。

INGRES 中是集中死锁检测

Page 16: 第七章  分布式数据库

16

结点 A 结点 B

T1

T2

T1

T2

T1 T2 EX 结点 A

T1 T2 EX 结点 B

分布式死锁检测 需要每个结点都负起检测全局死锁的责任。( 1)局部死锁检测器需要确定把潜在的死循环发送到哪个结点。 (等待它的结点或它等待的结点)( 2)哪些结点发送,哪些结点不发送。 如规定 EX等待的事务标识大于等待 EX的事务标识时发送。

Page 17: 第七章  分布式数据库

17

预防死锁 给事务赋予全局唯一标识符,若 Ti<Tj 决定Ti 等待 (Ti<Tj) 或重新启动 (Ti>Tj),事务重新启动时保持事务标识不变。使分布事务是按照事务的全局顺序执行的。 设置超时机构

Page 18: 第七章  分布式数据库

18

多副本的封锁:(1) 写全锁 写操作申请全部副本的排它锁,读操作仅申请一个副本的共享锁。(2) 封锁多数 不管是读还是写操作都需要获得对一半以上数据副本的锁(3) 封锁主副本 活动主副本(4) 集中封锁 指定一个结点负责锁管理,获得锁后才能对数据副本进行操作。

Page 19: 第七章  分布式数据库

19

7.4.1.3 基于时戳( Time Stamp )的并发控制 以时戳的顺序处理冲突,基本时戳法遵循准则: (1). 每个事务 T 开始时,在发生结点赋予时戳 TS ;

(2). 事务的读、写操作都带有该事务的时戳; (3). 每个数据 X 分别有最大时戳 RTM(X) 和 WTM(X); (4). 若事务 T 读 X , TS < WTM(X) 则拒绝并用新的时戳重新启动,否则执行读操作, RTM(X)置为 max(RTM(X), TS) (5). 事务写 X , TS < RTM(X) 或 TS < WTM(X) ,拒绝写并用新的时戳重新启动,否则执行写并置WTM(X) 为 TS 。

Page 20: 第七章  分布式数据库

20

例:事务 T1<T2 结点 A : R1(x)W1(x)R2(x)W2(x) 结点 B : R 1 (y)W1(y)R2(y)W2(y)执行 2PL : T1 T2

R1(x) TS1 0 0 0 W1(x) R 1 (y) TS1 TS1 TS1 0 R2(x) W 1 (y) TS2 TS1 TS1 TS1 W2(x) R2(y) TS2 TS2 TS2 TS1 W2(y) TS2 TS2 TS2 TS2

基于时戳的并发控制使得事务的并行执行等价于以时戳顺序确定的一个特定的串行序列。

按照时戳法: 设事务 T1 时戳为 TS1 ,事务 T2 时戳为TS2 , TS1<TS2

结点 A 结点 B RTM (X) WTM(X) RTM(Y) WTM(Y)

Page 21: 第七章  分布式数据库

7.4.2 分布式事务的恢复7.4.2.1 集中式数据库系统中的恢复 集中式数据库系统中恢复的手段主要是利用转储和日志• 日志文件的主要内容: (1). 事务处理的标识符; (2). 操作的类型(插入、删除、修改); (3). 更新前的值; (4). 更新后的值 .• 写检查点所作的操作: (1).将日志缓冲区中的内容强行写入日志文件; (2).将数据库缓冲区中的内容强行写入外存储器; (3).将检查点记录的地址写入重启动文件中。• 故障种类: 事务内部的故障、系统故障、介质故障。

Page 22: 第七章  分布式数据库

22

事务故障的恢复 事务恢复的原则

– 对事务内部的故障,不影响其它事务,将事务回退 (UNDO) 。

– 已提交的事务应该满足事务的持久性 , 发生故障后应该重做 (REDO) 它所做过的所有修改数据库的操作。 – 对非事务内部的故障,如系统崩溃等引起事务夭折。所有正在执行的事务都需要撤消 (UNDO)

Page 23: 第七章  分布式数据库

23

事务故障的恢复步骤 :( 1 )反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。

( 2 )对该事务的更新操作执行逆操作。( 3 )反向扫描,直至读到此事务的开始标志,

事务故障恢复就完成了。事务开始 故障点恢复

Page 24: 第七章  分布式数据库

24

系统故障的恢复步骤 :(1) 正向扫描日志文件(从头扫描日志文件)

找出在故障发生前已经提交的事务,将其事务标识记入重做( REDO )队列。 找出故障发生时尚未完成的事务,将其事务标识记入撤销( UNDO )队列。

(2) 对撤销队列中的各个事务进行撤消处理。( UNDO )

(3) 对重做队列中的各个事务进行重做处理。( REDO )

Page 25: 第七章  分布式数据库

25

介质故障的恢复 :

装入后备副本,重做已完成的事务。 装入有关日志文件的副本 :

首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。然后正向扫描日志文件,对重做队列中的所有事务进行

重做处理。即将日志记录中“更新后的值”写入数据库。

Page 26: 第七章  分布式数据库

26

具有检查点记录的恢复步骤 (1).从重启动文件中找出最近一个检查点记录地址;

(2). 得到检查点时刻事务清单; (3).从检查点以后,正向扫描日志文件,将已经完成的事务放入重做队列,对未完成的事务放入撤消队列。 (4) 对重做队列中的事务执行 REDO 操作; (5) 对撤消队列中的事务执行 UNDO 操作。

日志开始 检查点 …… 检查点 故障点

Page 27: 第七章  分布式数据库

27

7.4.2.2 分布式数据库系统中的恢复 分布式数据库中的故障:结点故障、通信故障 (信息丢失和网络分割 ) 。 恢复的单位是事务,故障发生前已完成的事务都在恢复之列。撤消 (undo) ;重做 (redo) 。 分布式事务的恢复分为三个层次: (1) 仅处理结点故障; (2) 仅处理结点和信息丢失二种故障; (3) 同时能够处理结点故障、信息丢失和网络分割三种故障。

Page 28: 第七章  分布式数据库

28

7.4.2.2 分布式数据库系统中的恢复 分布式事务的提交通过协调程序完成,子事务站点为参与者,执行协调程序的站点为协调者。 二阶段提交协议 (2PC) : 事务的提交分二个阶段: 准备提交阶段、提交阶段

– 所有子事务提交,全局事务才能提交;– 子事务的执行如果出了故障, 局部事务管理器可以决定中止子事务的执行。

Page 29: 第七章  分布式数据库

29

二阶段提交协议 (2PC) : 第一阶段为 Prepare 阶段,第二阶段为 Commit或 Abort 阶段。

协调者:(1) 写 Prepare信息到日志 , 发消息(2). 写提交或中止信息到日志 , 发消息;收到ACK 后写 Complete.

参与者:(1) 写提交 Ready信息到日志。(2) 写决定信息到日志。

Prepare

Ready Commit 或Abort

ACK

Page 30: 第七章  分布式数据库

30

站点故障 参与者与协调者不同处理。 参与者的处理: 参与者将“ Ready”信息写入日志前故障。协调者等待超时,其他子事务异常中止,该子事务重启后异常中止。

参与者将“ Ready”信息写入日志后故障。其他子事正确结束 (Commit 或 Abort) ,该子事务重启后由协调者提供信息正确结束。

Page 31: 第七章  分布式数据库

31

站点故障 协调者的处理: 协调者将“ Prepare”信息写入日志后故障。所有工

作正常的参与者挂起,协调者恢复后重新发“ Prepare”信息,参与者应能识别是否是协调者重新发来的信息,再次发“ Ready”信息。

协调者将决定信息写入日志后故障。“ Complete”信息写入日志前的故障需协调者恢复后重新发决定信息,挂起的子事务继续提交,已提交子事务只发” ACK”信息 .

协调者将 Complete信息写入日志前故障。

Page 32: 第七章  分布式数据库

32

报文丢失 第一阶段: 协调者的“ Prepare”信息丢失。没有收到“ Prepare”信息的参与者等待,协调者等待超时,子事务异常中止。

参与者的“ Ready/Abort”信息丢失。协调者等待超时,子事务异常中止。

第二阶段: 协调者的“ Commit/Abort”信息丢失,参与者处于等待状态。

参与者的“ ACK”信息丢失,协调者等待。

Page 33: 第七章  分布式数据库

33

网络分割 协调者子网: 协调者收不到其它参与者的信息,按参与者发生故障处理。在同一子网的参与者 子事务可以正常结束(中止)。 参与者子网: 参与者收不到协调者的信息,按协调者故障处理。2PC 协议存在的问题:阻塞 在参与者发出准备好信息后协调者发生故障或通信故障,子事务将挂起,它所占有的资源不能释放,降低了系统效率。

Page 34: 第七章  分布式数据库

34

  三阶段提交协议 (3PC) :

第一阶段:同 2PC 协议; 第二阶段:协调者若收到一个“ Abort” 或在规定时间内没有收到“ Ready” ,通知所有参与者“ Abort” 事务。否则向参与者发“ Enter-Prepare- State”信息使其进入新的准备好提交状态,参与者收到该信息后将“ Enter-Prepare- State”信息写入日志并给协调者发回一个“ OK”信息; 第三阶段:第二阶段协调者发出的不是“ Abort”信息进入这一阶段,接收到参与者的“ OK”信息后发“ Commit”给参与者正式提交事务。

Page 35: 第七章  分布式数据库

35

协调者

参与者

PREPARE

ABORT

ABORT

ACK

事务撤消事务撤消

Page 36: 第七章  分布式数据库

36

协调者

参与者

PREPARE

READY

COMMIT

ACK

Enter-Prepare- State

OK

事务正常提交

Page 37: 第七章  分布式数据库

37

  3PC 协议对故障处理: 参与者结点的故障 处理与 2PC 协议相同。 协调者故障 参与者中选一个新的协调者,若新的协调者: (1) 处在“ Abort” 状态,所有接点异常中止事务; ( 2 )处于“ Enter-Prepare-State”状态,向所有正常工作的参与者发“ Enter-Prepare-State”信息提交事务; (3) 处于“ Commit”状态,给参与者发“ Commit”信息。

Page 38: 第七章  分布式数据库

38

  7.4.2.3 多副本的更新 (1). 更新主副本 仅更新主副本,其它副本的更新在事务结束后由主副本负责更新。对非主副本的操作要等到更新结束后才能进行。 “活动主副本”。 (2). 结点保留一张表,记录每个不可更新的结点 (3).快照 数据在某一时刻的状态 , 存储在外存上,定期刷新。快照仅提供读操作。

Page 39: 第七章  分布式数据库

39

3. 快照方法快照:数据在某一时刻的状态 , 存储在外存上,定期刷新。快照仅提供读操作。

DEFINE SNAPSHOT HP_BOOK AS SELECT * FROM BOOK WHERE PRICE > 100

REFRESH EVERY DAY.

REFRESH SNAPSHOT HP_BOOK .

Page 40: 第七章  分布式数据库

40

7.5 分布式目录 目录 (Catalog)

一个“微小 DB”, 描述 DB 的元数据(metadata)

分布式目录需要实现: 目录的存储、存取、并发控制和恢复目录管理策略对提高数据库系统性能至关重要

Page 41: 第七章  分布式数据库

41

目录的内容 全局模式描述 分片模式描述 分布模式描述 局部名映射 建立物理映象与站点数据名的对应关系 存取方式描述 索引 数据库统计信息 关系的元组数、元组长度、存放空间 一致性约束 完整性约束和存取权限状态信息 记录站点及事务的运行状态 数据表示 提供对异构数据库的支持系统描述 站点软硬件配置和处理能力的信息

Page 42: 第七章  分布式数据库

42

组织方式独立式 利用 OS 提供的文件管理功能建立和维护目录信息 嵌入式 DBMS 与目录信息一体化 , 即数据目录系统作为

DBMS 的子集 , DBMS通常应用该方式 分离式 利用 DBMS 的管理功能建立和维护目录信息 , 但其

用户界面和功能均独立于 DBMS

Page 43: 第七章  分布式数据库

43

7.5.1 目录的分布和管理目录分布策略:

集中式 全复制式目录 部分复制式 ( 部分站点、部分目录 )

目录的高速缓存(目录赋予版本号,缓冲的目录不必与最新目录一致, 传送访问计划到有关结点时包括目录数据的版本号, 版本号不一致再更新目录 )

Page 44: 第七章  分布式数据库

44

SDD-1 目录特点 SDD-1 的目录采用全局和局部混合的方式,其中:

全局模式描述、分片和分布信息是全复制的,其余目录信息局部存储。

SDD-1支持目录缓冲,允许局部结点缓冲远程目录信息但要求与最新版本一致。

7.5.2 不同分布式数据库系统中的目录分布和管理

Page 45: 第七章  分布式数据库

45

System R* 的目录特点 R* 的目录具有局部自治性 每个站点存放 本站点上生成 和 在本站点上存储数

据的目录 如果在本结点生成的数据项 没有存放在这个结点,

则在相应目录项中需指出该数据存放在哪些结点上 R*支持带有版本号的目录缓冲以验证数据的有效性。

Page 46: 第七章  分布式数据库

46

System R* 的命名机制 系统范围名、打印名系统范围名 由 4 部分组成 : 创建对象的用户标识符 , 用户所在站点名,对象名 , 对象的源站点名 User-1 @shanghai. EMP @ beijing打印名

系统范围名的速记名,如 EMP省略部分表示当前用户和当前站点

Page 47: 第七章  分布式数据库

  ORACLE 分布式数据库简介ORACLE 的分布式特点:• 局部自治 数据由本地 DBA 管理,其他结点要存取该结点的数据,要由本地 DBA授权• 不依赖中央场地, 所有结点平等,每个结点有自己的数据字典。• 复制独立 数据备份可存放在多个结点,提供快照。• 分布式事务处理,执行 2PL 协议• 硬件独立 适宜于各种机型• 操作系统独立 • DBMS独立 Oracle *NET *CONNECT 支持与非Oracle系统的连接,如 DB2 、 SYBASE 、 SQL/DS

Page 48: 第七章  分布式数据库

48

客户

服务器

数据库

客户

数据库

服务器

Page 49: 第七章  分布式数据库

49

  ORACLE 的查询优化:• 分为物理层和逻辑层优化• ORACLE 的优化没有用统计分析信息,主要利用索引和聚簇改善查询性能。 若没有建立索引,系统用合并扫描进行连接: 系统将按连接的列分类排序,合并扫描完成连接。

Page 50: 第七章  分布式数据库

50

  ORACLE 的事务管理:• 划分事务: COMMIT 、 ROLLBACK 、 DDL语句,如 CREATE … • 锁: ORACLE 中的锁是自动的,也可以用显式锁 数据锁( DML )

字典锁(如 DDL )字典锁是隐式的

Page 51: 第七章  分布式数据库

51

• 数据锁 :

( 1 ) RS 行共享锁 LOCK TABLE < 表名 >IN ROW SHARE MODE ( 2 ) RX 行排它锁 LOCK TABLE < 表名 >IN ROW EXCLUSIVE MODE ( 3 ) S 共享表锁 LOCK TABLE < 表名 >IN SHARE MODE( 4 ) SRX 共享行排它表锁 LOCK TABLE < 表名 >IN SHARE ROW EXCLUSIVE MODE (5) 排它表锁 LOCK TABLE < 表名 > IN EXCLUSIVE MODE

ORACLE自动检测和消除死锁

Page 52: 第七章  分布式数据库

52

  ORACLE 的恢复: 卸出 /装入: EXP/IMP 检查点: ALTER SYSTEM CHECKPOINT 设置检查点。执行该命令后确保提交事务所做的修改全部写入数据库。 日志:前映象( BI )、后映象( AI )

恢复: 在提交分布式事务期间,出现机器或网络故障,修复后ORACLE 恢复事务。 在 DOS 下执行如下命令恢复: ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY

Page 53: 第七章  分布式数据库

53

ORACLE 的目录结构Oracle 数据库中的目录包含用户目录和系统目录 基础表 目录中的信息保存在基础表中,只有 DBMS 能够读

写基础表,基础表是加密的。 用户视图 有三类视图:前缀为 USER 的视图: 给定用户拥有对象的视图前缀为 ALL 的视图: 扩展的用户视图(用户可存取的视图)前缀为 DBA 的视图: DBA视图

Page 54: 第七章  分布式数据库

54

ORACLE 的目录特点 具有站点自治性,数据目录是局部的命名机制

对象的全局名:对象的模式名、对象名、数据库名数据库全局名: <数据库名 >.< 域名 > SCOTT.EMP @MYOracle.CITYHUNTER.COM

Page 55: 第七章  分布式数据库

55

例:站点 A 上的用户要对站点 B(EMP) 和 C(DEPT)上的数据进行访问 SELECT ENAME, JOB, DNAME FROM EMP@ B, DEPT@ C WHERE EMP.DEPTNO=DEPT.DEPTNO AND LOC=‘DALLAS’ AND JOB IN(‘CLERK’, ‘ANALYST’);

结束