设计时可能遇到的问题 (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)
设计时可能遇到的问题 (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 可以暂时不考虑
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 中事务执行的过程• 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 中删除
元组操作类型的状态转换• 状态转换图中的转换
关系如右表所示(“ /”表示该情况不会出现):
上次更新类型 本次更新类型 最终更新类型
0
1 1
2 2
3 3
1
1 1
2 /
3 3
2
1 2
2 /
3 0
3
1 /
2 1
3 /