2. 悲观锁定简介
概括的说,悲观锁定避免了在乐观锁定时,用户同时编辑记录的冲突,让每条记录有顺序的被更新。
2.1 悲观锁定的特点
· 悲观锁定适用Feature level 7的数据库
· 使用Hook脚本对其设置
· 在执行"Apply","Revert"或是超时后,锁定记录被自动解锁
· 超级用户可以强制性解除锁定,每个用户也可以解除自己的锁定
· 可以使用"Lock_by"域来查询被锁记录
2.2 设置悲观锁定
ClearQuest v7.1中不能直接通过客户端使用悲观锁定,必须通过一定的配置来实现该功能。下面以一个常用的操作为例子,介绍一下如何进行设置。
假设两个用户Alice,Bob同时更改记录SAMPL00000001,Alice对该记录做了锁定设置,当Bob此时想要编辑该记录时,被提示该记录被锁定,通知管理员解锁。
第一步,在ClearQuest Designer中新建一个类型为Base的行为Lock,对该行为新建一个初始化行为(Action_Initialization)脚本LockRecord,编写脚本:"$entity->LockRecord(0)",这里我们选用perl脚本作为编辑脚本。

第二步,用类似的方法再建一个UnLockRecord行为,选择此行为的类型为RECORD_SCRIPT_ALIAS,新建记录脚本UnLockRecord,并与UnLockRecord行为关联。

脚本UnLockRecord:
sub Defect_UnlockRecord {
my($result);
my($param) = @_;
# record type name is Defect
$result = "";
my $locked_by = $entity->GetLockOwner();
if ($locked_by ne "") {
my $do_unlock = $session->IsUserSuperUser();
if (! $do_unlock) {
# If the current user holds the lock, let them unlock it.
my $username = $session->GetUserLoginName();
if ($username =~ /^$locked_by$/i) {
$do_unlock = 1;
}
}
if (! $do_unlock) {
# Additional options to "authorize" unlocking:
# 1) allow if user is a member of an "unlock" group
# get user's groups, check if member
# 2) allow for privileged users, e.g. Security Administrator
# check session for the chosen privilege
# 3) many other possibilities
#
# if ( user-should-be-allowed-to-unlock-the-record ) {
# $do_unlock = 1;
# }
}
if ($do_unlock) {
$entity->UnlockRecord();
}
else {
$result = "You are not allowed to unlock this record.";
}
}
return $result;
}
现在升级你的数据库,至此我们便完成了锁定设置。
接下来,在ClearQuest客户端中建立一个对锁定记录的查询,这里使用域"Lock_by"作为filter,选择觉得可能的Owner。值得提一下的是,这个域在v7.1之前作filter是无效的,而在v7.1中加入悲观锁定功能后,通过它可以看到哪些记录被锁了,谁锁了等等这些信息。
