Distributed Travel Reservation System

31
Distributed Travel Reservation System (Part )

description

Distributed Travel Reservation System. (Part Ⅰ). Client1. Client 2. Client n. Resource Manager. 基本框架结构 (Part I) :C/S. Flights, Hotels, Cars, Customers. 设计时可能遇到的问题 (1-1). 1. 运行环境 操作系统 Solaris VM or Windows or Linux (Unix) 开发语言 JAVA JDK1.2.2 以上版本 - PowerPoint PPT Presentation

Transcript of Distributed Travel Reservation System

Distributed Travel Reservation System

(Part )Ⅰ

基本框架结构 (Part I) :C/S

Resource

Manager

Flights, Hotels,

Cars, Customers

Client1 Client 2 Client n

设计时可能遇到的问题 (1-1)

1. 运行环境

• 操作系统Solaris VM or Windows or Linux (Unix)

• 开发语言JAVA JDK1.2.2 以上版本 (Windows 下需要 Make 工具 )

设计时可能遇到的问题 (1-2)

• JAVA 环境变量设置Set

path = …………;C:\j2sdk1.4.0_01\bin\

CLASSPATH = .;C:\j2sdk1.4.0_01\lib\tools.jar;C:\j2sdk1.4.0_01\lib\dt.jar;C:\j2sdk1.4.0_01\jre\lib\rt.jar;D:\project\

设计时可能遇到的问题 (1-3)

• 怎样运行javac *.java 生成 *.class 文件rmic transaction.ResourceManagerImpl

make runreg 注册端口号make runserver 运行 Server 端make runclient 运行 Client 端Ctrl + c to kill the server

设计时可能遇到的问题 (1-4)

• Linux, Unix, Solaris VM 下可以无须改动makefile(part1.rar 中 ), 可正常运行 , 运行时不需要 make runreg 命令 .

设计时可能遇到的问题 (2-1)

2.RMI 与 Thread

• RMI (Remote Method Invocation)

rebind(name, obj) 和 bind(name, obj)

lookup(name)

设计时可能遇到的问题 (2-2)

• Thread

run() 定义线程体 sleep(long millis) 睡眠 millis 毫秒 start() 启动线程

设计时可能遇到的问题 (3-1)

3.Lock Manager (lockmgr 包 )

• lock(xid, thingBeingLocked, read|write)

throws DeadlockException

• unlockAll(xid)

设计时可能遇到的问题 (3-2)

• lock() 方法对于重复上锁的 thing, 第二次的上锁被视为无效 , 只是返回 , 并不加入到锁表中 .

• unlockAll(xid) 方法一次性释放 xid 事务所拥有的全部资源 .

设计时可能遇到的问题 (4)

4.ITE 和 TAE

• ITE ------ InvalidTransactionException

记录可用的事务号• TAE ------ TransactionAbortedException

e.g.,deadlock

设计时可能遇到的问题 (5)

5. 事务可以挂起吗 ?

• 挂起 ------ 不 commit, 也不 abort

• 可以挂起 , 真正的 RM 用超时机制强制abort 此类事务

• 程序中可以不考虑

设计时可能遇到的问题 (6)

6. 怎样实现多粒度锁 ?

• 粒度 tables 和 tuples

• 意向锁 (IS 和 IX)

lm 不直接提供 , 但建议实现 :

read – S,S update – S,X

insert/delete – X,X

设计时可能遇到的问题 (7)

7. 读 / 写磁盘• readObject() • writeObject(Object) e.g. public class FlightsItem implements

java.io.Serializable{ ………… }

设计时可能遇到的问题 (8)

8.Customers 和 Reservations 表可以合并吗 ?

• 可以合并• Reservations 不含主键 , 但通常按

custName 查询• Reservations(String custName, List resv)

• resv(int resvType, String resvKey)

设计时可能遇到的问题 (9-1)

9. 测试与异常

• 测试 (Test)

shutdown(), dieNow(),

dieBeforePointerSwitch(),

dieAfterPointerSwitch()

设计时可能遇到的问题 (9-2)

• 异常处理 InvalidTransactionException,

TransactionAbortedException,

DeadlockException

IOException 和 RemoteException 可以暂时不考虑

设计时可能遇到的问题 (10)

10. 原子性的实现

• Shadow 思想

• Log 日志方法

Distributed Travel Reservation System

( 实现细节 )

Part1 中的主要数据结构• 1. 硬盘上:

– ( 1 )数据库主指针: masterpointer» 指向最新版本的满足完整性的一组数据库

– ( 2 )数据库:» Flights1 Flights2» Hotels1 Hotels2» Cars1 Cars2» Reservations1 Reservations2» 两组数据库,一组保存最新版本的满足完整性的数据

库,另一组保存上一个版本的满足完整性的数据库(少提交一个事务),两者轮换

Part1 中的主要数据结构• 2. 内存中:

– ( 1 )内存中当前活动的表:» FLIGHTS , HOTELS , CARS , RESERVATIONS

– ( 2 )内存中当前不活动的表:» FLIGHTSBAK , HOTELSBAK , CARSBAK , RES

ERVATIONSBAK

– ( 3 )当前活动的事务的事务号的集合:» TransactionXidSet

– ( 4 )记录被事务弄脏数据的表:» TransactionList

Part1 中事务执行的过程• 1.start

• 2. 执行对表的操作,如 addFlight

• 3.commit 或 abort

Part1 中事务执行的过程• 1.start

– 调用 start 函数,得到一个事务号 tid– 将得到的 tid 加到 TransactionXidSet 中

Part1 中事务执行的过程• 2.addFlight

– 修改活动的表 FLIGHTS– 将此操作记录到 TransactionList 中,以备

commit 或 abort 时使用

Part1 中事务执行的过程• 3.commit 或 abort

– ( 1 ) commit :• 根据 TransactionList 中事务号为 tid 的事务的脏数

据列表,对不活动的表 FLIGHTSBAK 进行相应的修改,使其与 FLIGHTS 一致

• 将 FLIGHTSBAK 写到硬盘上主指针没有指向的数据库,假设是 Flights2

• 修改主指针• 将事务号为 tid 的事务的相关内容从

TransactionXidSet 和 TransactionList 中删除

Part1 中事务执行的过程• 3.commit 或 abort

– ( 2 ) abort :• 根据 TransactionList 中事务号为 tid 的事务的脏数

据列表,对活动的表 FLIGHTS 进行相应的修改,使其与 FLIGHTSBAK 一致

• 将事务号为 tid 的事务的相关内容从TransactionXidSet 和 TransactionList 中删除

元组操作类型的状态转换• 一个事务对一个元组进行的操作共有以下 4

种类型:0 :此事务没有操作过此元组1 :此事务修改了此元组2 :此事务新建了此元组3 :此事务删除了此元组

元组操作类型的状态转换• 4 种更新类型的转换关系如下:

0 1

23

1

3

1

2

3

13

2

元组操作类型的状态转换• 状态转换图中的转换

关系如右表所示(“ /”表示该情况不会出现):

上次更新类型 本次更新类型 最终更新类型

0

1 1

2 2

3 3

1

1 1

2 /

3 3

2

1 2

2 /

3 0

3

1 /

2 1

3 /

元组操作类型的状态转换• 先“修改”再“删除”等于“删除”• 先“新建”再“修改”等于“新建”• 先“新建”再“删除”等于“没有操作”• 先“删除”再“新建”等于“修改”

谢谢!