310 likes | 460 Views
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 以上版本
E N D
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以上版本 (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日志方法
Part1中的主要数据结构 • 1.硬盘上: • (1)数据库主指针:masterpointer • 指向最新版本的满足完整性的一组数据库 • (2)数据库: • Flights1 Flights2 • Hotels1 Hotels2 • Cars1 Cars2 • Reservations1 Reservations2 • 两组数据库,一组保存最新版本的满足完整性的数据库,另一组保存上一个版本的满足完整性的数据库(少提交一个事务),两者轮换
Part1中的主要数据结构 • 2.内存中: • (1)内存中当前活动的表: • FLIGHTS,HOTELS,CARS,RESERVATIONS • (2)内存中当前不活动的表: • FLIGHTSBAK,HOTELSBAK,CARSBAK,RESERVATIONSBAK • (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:此事务删除了此元组
1 0 1 1 3 3 3 2 2 3 2 1 元组操作类型的状态转换 • 4种更新类型的转换关系如下:
元组操作类型的状态转换 • 状态转换图中的转换关系如右表所示(“/”表示该情况不会出现):
元组操作类型的状态转换 • 先“修改”再“删除”等于“删除” • 先“新建”再“修改”等于“新建” • 先“新建”再“删除”等于“没有操作” • 先“删除”再“新建”等于“修改”