加锁管理程序
任务:
你在一个 DBMS(Data Base Management System) 开发小组中工作,今天你的任务是编写一个管理加锁事宜的程序。
在 DBMS 中,可以使用锁来控制多个程序对数据项的访问:当程序要访问数据项时,要给数据项上锁。如果它仅仅是读取数据项,则通常上共享锁,这样其它的事务也可以同时读取该数据项。而若此程序是要修改数据项,则会给它数据项上独占锁,此时其它程序也就不能再访问这个数据项了。
对于同一个数据项,若有不同的程序同时给一个数据项上锁,且其中至少有一个是独占锁时,就表示它们发生了冲突。当发生冲突时,加锁的请求就会被拒绝。
每个加锁请求包含三个元素:锁模式、事务标识符和数据项标识符。两个程序可以同时给数据项上锁,前提是它们没有冲突。
在早期开发阶段,你需要编写一个简单的锁管理程序来处理加锁请求。它使用以下的规则来处理各种请求:
-
若一个加锁请求与先前的加锁请求没有发生冲突,则 DBMS 许可这个加锁请求;
-
一旦允许了一个加锁请求,则它将永远锁定数据项,不会改变,也不会释放;
-
如果一个程序的加锁请求与已有的锁发生了冲突,则 DBMS 拒绝这个加锁请求;
-
如果一个程序的加锁请求被拒绝,则 DBMS 忽略由这个程序发出的后续所有加锁请求。
输入:
输入由一系列的加锁请求组成,每一个请求占一行。请求的格式如下:
MODE TRID ITEM
其中 MODE 是代表被请求的所模式的一个小写字母 s 或者 x。TRID 和 ITEM 分别是程序标识符和数据项标识符。TRID 和 ITEM 都是整数,大于 0,并且最多包含有 9 个十进制数字。
在输入中包含有至少一个,不超过一万条加锁请求。
输入的结束标志是单独一行的字符“#”。
输出:
你的程序应该能够连续地处理输入的请求,对于每一个请求,做出相应的相应,并将相应输出。响应可以有以下集几种:
-
GRANTED:该加锁请求没有同先前的任何加锁请求发生冲突,DBMS 会许可这个请求,对相应数据项上锁;
-
DENIED:该加锁请求同先前的某个锁发生冲突,DBMS 拒绝这个加锁请求;
-
IGNORED:发出加锁请求的程序之前已经被拒绝过。
响应必须完全以如上所示的的大些字母来表示。
[此贴子已经被作者于2006-5-24 21:05:42编辑过]