技术开发 频道

ClearQuest V7.1从乐观锁定到悲观锁定

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中加入悲观锁定功能后,通过它可以看到哪些记录被锁了,谁锁了等等这些信息。

0
相关文章