ClearQuest V7.1從樂觀鎖定到悲觀鎖定
隨著IT科技的不斷普及,越來越多公司引入項目管理工具,這使得項目管理更具有實時性,并更加透明化。ClearQuest是一個在項目管理中常用的工具,項目參與者不僅可以通過它實時更新項目,同時也可以了解項目其他成員的進(jìn)度和相關(guān)情況。
當(dāng)多人次同時對同一記錄編輯時,顯然需要軟件擁有一種處理機(jī)制來避免由于這樣的操作所帶來信息沖突和不便。在這種情況下,ClearQuest應(yīng)對不同的客戶需求,提供了兩種解決機(jī)制,稱之為"樂觀鎖定"和"悲觀鎖定"。
1. 背景介紹
在ClearQuest v7.1以前的版本中,只有一種鎖定機(jī)制"樂觀鎖定"。它使用戶很方便地更新數(shù)據(jù),不需要做任何設(shè)置更改,也不需要在乎其他人對該記錄的操作,只要該用戶直接編輯,便可順利的完成整個數(shù)據(jù)更新步驟。從而使用戶避免了復(fù)雜的加鎖解鎖操作。這種情況下,在一條數(shù)據(jù)被"Apply"后,同時更新該記錄的其他用戶只允許編輯,而不能"Commit"。
然而在使用的過程中,越來越多的用戶發(fā)現(xiàn)這種處理機(jī)制帶來了很多的不方便,常常做了很多更改后才發(fā)現(xiàn)不能"Apply",而不得不重新來做。如何使用戶在編輯時就知道,該記錄已經(jīng)被鎖定,從而避免做無用功呢?在ClearQuest v7.1中,一種新的鎖定機(jī)制被引用"悲觀鎖定"。如果用戶A希望某條記錄只能由自己編輯,其他人在這期間想要更新該記錄時,可以得到提示表明該記錄已被用戶A 鎖定,便可使用"悲觀鎖定"。該機(jī)制需要用戶做一些簡單的設(shè)置才能生效。下圖說明了"悲觀鎖定"的工作方式。
接下來,本文會著重介紹ClearQuest v7.1中這種新的鎖定機(jī)制"悲觀鎖定"。
2. 悲觀鎖定簡介
概括的說,悲觀鎖定避免了在樂觀鎖定時,用戶同時編輯記錄的沖突,讓每條記錄有順序的被更新。
2.1 悲觀鎖定的特點
◆悲觀鎖定適用Feature level 7的數(shù)據(jù)庫
◆使用Hook腳本對其設(shè)置
◆在執(zhí)行"Apply","Revert"或是超時后,鎖定記錄被自動解鎖
◆超級用戶可以強(qiáng)制性解除鎖定,每個用戶也可以解除自己的鎖定
◆可以使用"Lock_by"域來查詢被鎖記錄
2.2 設(shè)置悲觀鎖定
ClearQuest v7.1中不能直接通過客戶端使用悲觀鎖定,必須通過一定的配置來實現(xiàn)該功能。下面以一個常用的操作為例子,介紹一下如何進(jìn)行設(shè)置。
假設(shè)兩個用戶Alice,Bob同時更改記錄SAMPL00000001,Alice對該記錄做了鎖定設(shè)置,當(dāng)Bob此時想要編輯該記錄時,被提示該記錄被鎖定,通知管理員解鎖。
第一步,在ClearQuest Designer中新建一個類型為Base的行為Lock,對該行為新建一個初始化行為(Action_Initialization)腳本LockRecord,編寫腳本:"$entity->LockRecord(0)",這里我們選用perl腳本作為編輯腳本。
第二步,用類似的方法再建一個UnLockRecord行為,選擇此行為的類型為RECORD_SCRIPT_ALIAS,新建記錄腳本UnLockRecord,并與UnLockRecord行為關(guān)聯(lián)。
腳本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;
- }
現(xiàn)在升級你的數(shù)據(jù)庫,至此我們便完成了鎖定設(shè)置。
接下來,在ClearQuest客戶端中建立一個對鎖定記錄的查詢,這里使用域"Lock_by"作為filter,選擇覺得可能的Owner。值得提一下的是,這個域在v7.1之前作filter是無效的,而在v7.1中加入悲觀鎖定功能后,通過它可以看到哪些記錄被鎖了,誰鎖了等等這些信息。
2.3 驗證
下面檢驗一下剛才的設(shè)置。
第一步,使用ClearQuest Administrator創(chuàng)建兩個用戶Alice,Bob,見下圖。
第二步,分別使用Alice和Bob兩個帳號登錄ClearQuest客戶端。先讓我們檢查一下Unlock Action是不是在Action Dropdown list中以及新建的域Lock_by能否在客戶端顯現(xiàn)。
第三步,假設(shè)Alice正在對記錄SAMPL00000001編輯,Bob試圖修改該記錄,發(fā)現(xiàn)此記錄被鎖,于是告知管理員希望他解除鎖定。
第四步,在進(jìn)行解鎖之前,我們利用剛才建的查詢,查看一下,現(xiàn)在被鎖定的記錄,返回結(jié)果當(dāng)前只有一條記錄被鎖,即SAMPL00000001。
第五步,我們有Apply,Revert和Unlock三種方式解除記錄鎖定,先看看這三種方式有什么不同。
Apply -- Bob在此動作后編輯SAMPL00000001,會發(fā)現(xiàn)自己仍然不能進(jìn)行操作,這是因為此時兩人所屬的數(shù)據(jù)庫并不同步,Bob如果想要繼續(xù)編輯記錄,需要重新連接數(shù)據(jù)庫.
Revert -- 大家應(yīng)該已經(jīng)猜到了,這個時候Bob可以成功編輯SAMPL00000001
Unlock -- 這是通過hook腳本來解除鎖定,所以Bob也可以編輯SAMP SAMPL00000001
對于前兩種操作,作為用戶的Alice都可以幫助Bob解除記錄鎖,但是如果想要使用Unlock動作,我們必須通知高級管理員,普通用戶并沒有權(quán)限執(zhí)行該動作。
第六步,這里我們用上面設(shè)置的Unlock行為來解鎖。使用Admin用戶登錄ClearQuest客戶端,點擊"Unlock"?;仡^再來看看,Bob現(xiàn)在能不能編輯SAMPL00000001??梢钥吹?,現(xiàn)在Bob可以成功編輯SAMPL00000001了。
3. 補充
實際上,鎖定一條或多條記錄,除了上面講到的建立一個Base的行為Lock以外,也可以類似與Unlock行為一樣,建立一個類型為RECORD_SCRIPT_ALIAS的Lock行為,這樣做可以方便用戶自己決定是否鎖定記錄。
感興趣的朋友還可以通過findrecordlocks.pl 進(jìn)一步找到當(dāng)前被鎖記錄的一些相關(guān)信息,該腳本在ClearQuest V7.1的安裝目錄下 \IBM\RationalSDLC\ClearQuest\,運行:
- cqperl findrecordlocks.pl [-dbset < dbset_name>]
- [-database < user_database>]
- < clearquest_login>
- < clearquest_password>
- { < record_type_list> | -all }
- [-unlock]
- [-scan < interval>]
- [-timeout < interval>]
- [-times < times>]
- [-loglevel < error|info|verbose>]
以上面的記錄SAMPL00000001為例,Alice鎖住了記錄SAMPL00000001,運行:
cqperl "F:\Program Files\IBM\RationalSDLC\ClearQuest\findrecordlocks.pl"-dbset ss admin "" Defect,看看結(jié)果是不是如實際操作的一樣。
4. 附錄
類型為RECORD_SCRIPT_ALIAS的Lock行為的perl腳本
- sub Defect_LockRecord {
- my($result);
- my($param) = @_;
- # record type name is Defect
- if (ref ($param) eq "CQEventObject") {
- # add your CQEventObject parameter handling code here
- } elsif (ref (\$param) eq "SCALAR") {
- # add your scalar parameter handling code here
- # The Web clients support scalar paramter type only,
- # so the hook code added in the above section, needs to be duplicated here
- } else {
- # add your handling code for other type parameters here, for example:
- # die("Unknown parameter type");
- }
- $entity->LockRecord(0);
- return $result;
- }
5.結(jié)束語
本文介紹了ClearQuest V7.1中的記錄鎖定機(jī)制,重點讓大家了解了兩種鎖定機(jī)制及如何使用"悲觀鎖定。"
【編輯推薦】