国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

頁(yè)面鎖定的鎖定方案--多客戶(hù)環(huán)境下VB數(shù)據(jù)庫(kù)編程之(7)

2019-11-18 17:45:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
如前所述,MicrosoftJet不能鎖定單個(gè)的記錄,每次讀、寫(xiě)以及鎖定的都是一頁(yè)數(shù)據(jù),面不是一個(gè)記錄。根據(jù)記錄的大小,一頁(yè)可能包含多個(gè)記錄。當(dāng)鎖定一個(gè)記錄時(shí),就會(huì)鎖定那一頁(yè)上的所有記錄,如圖8.6所示。

在高并發(fā)應(yīng)用程序中,要求對(duì)指定記錄提供暢通無(wú)阻的訪(fǎng)問(wèn)??梢杂貌煌牟呗詠?lái)實(shí)現(xiàn)設(shè)計(jì)。

1.使用Text類(lèi)型??梢杂肨ext數(shù)據(jù)類(lèi)型把字段添加到表中,直到記錄長(zhǎng)度超過(guò)1024個(gè)字節(jié)。由于Text是變長(zhǎng)數(shù)據(jù)類(lèi)型,必須顯式地用數(shù)據(jù)來(lái)填補(bǔ)字段以獲得一個(gè)定長(zhǎng)格式。同時(shí),這種技術(shù)可能會(huì)降低性能,因?yàn)槿绻總€(gè)記錄都占用2K磁盤(pán)空間,則數(shù)據(jù)庫(kù)的長(zhǎng)度將會(huì)增加。因此,建議不要使用Text數(shù)據(jù)類(lèi)型。

2.使用CHAR類(lèi)型。SQLDDLCHAR是一種定長(zhǎng)數(shù)據(jù)類(lèi)型。如果使用這種類(lèi)型,則可不必用數(shù)據(jù)來(lái)填補(bǔ)字段。使用CHAR數(shù)據(jù)類(lèi)型是實(shí)現(xiàn)這種技術(shù)的最簡(jiǎn)單而且保險(xiǎn)的唯一方法。

3.使用開(kāi)放鎖定。另一種策略是:在任何地方都使用開(kāi)放方式鎖定。雖然開(kāi)放式鎖定不能避免頁(yè)面鎖定,但它可以使記錄被鎖定的時(shí)間最短,因此降低了不需要鎖定的記錄也被鎖定的可能性。

4.使用自定義的鎖定方案。有時(shí)候,頁(yè)面鎖定不能滿(mǎn)足需要,而開(kāi)放式鎖定也可能無(wú)法滿(mǎn)足需要。在這種情況下,可以考慮使用自定義的鎖定方案。當(dāng)一個(gè)記錄被鎖定時(shí),可以用一個(gè)鎖定表來(lái)標(biāo)識(shí)。鎖定表存儲(chǔ)記錄的鍵值、鎖定狀態(tài)(鎖定或未鎖定)以及鎖定記錄的用戶(hù)名等。自定義鎖定方案的實(shí)現(xiàn)需要大量的設(shè)計(jì)、實(shí)現(xiàn)以及測(cè)試時(shí)間。在許多情況下,它不能與內(nèi)置的MicrosoftJet的功能重復(fù)。例如,即使實(shí)現(xiàn)單記錄鎖定,處理基于多個(gè)表的記錄集的數(shù)據(jù)也是非常困難的,因?yàn)楸仨殬?biāo)識(shí)所有表,而這些表都包含必須鎖定的記錄。當(dāng)自定義鎖定方案只影響幾個(gè)表,而且不是基于一個(gè)具有復(fù)雜連結(jié)和關(guān)系的數(shù)據(jù)模型時(shí),使用自定義鎖定方案較為適宜。

頁(yè)面鎖定中的錯(cuò)誤處理

當(dāng)使用頁(yè)面鎖定時(shí),必須在代碼中檢查是否成功地實(shí)現(xiàn)了鎖定。在開(kāi)始時(shí)應(yīng)禁止錯(cuò)誤處理程序,然后嘗試完成初始化一個(gè)鎖定、檢查錯(cuò)誤,最后允許錯(cuò)誤處理程序。在多用戶(hù)環(huán)境下,所遇到的頁(yè)面鎖定錯(cuò)誤有三種,見(jiàn)表。

錯(cuò)誤代碼和出錯(cuò)信息原因和建議的操作
3186不能存儲(chǔ);當(dāng)前正被機(jī)器<nane>上的<name>用戶(hù)鎖定當(dāng)一個(gè)用戶(hù)試圖更新一頁(yè),而這一頁(yè)包含了另一個(gè)用戶(hù)設(shè)置的讀鎖定時(shí),就會(huì)發(fā)生這個(gè)錯(cuò)誤。為了處理這個(gè)錯(cuò)誤,可以先等待一會(huì)兒,然后重新存儲(chǔ)該記錄。也可以通知發(fā)生這個(gè)問(wèn)題的用戶(hù),并詢(xún)問(wèn)他們是否想要重試該操作
3197因?yàn)楹土硪粋€(gè)用戶(hù)試圖同時(shí)改變同一個(gè)數(shù)據(jù),所以MicrosoftJet數(shù)據(jù)庫(kù)引擎終止了該過(guò)程在打開(kāi)記錄集或最后一次從記錄中讀取數(shù)據(jù)之后,另一個(gè)用戶(hù)對(duì)當(dāng)前記錄作了更改,并使用Edit方法或Update方法時(shí),就會(huì)產(chǎn)生這個(gè)錯(cuò)誤。如果在使用Edit方法時(shí)產(chǎn)生了這個(gè)錯(cuò)誤,就要用當(dāng)前數(shù)據(jù)來(lái)刷新用戶(hù)的數(shù)據(jù)視圖然后再試一次Edit方法。如果這個(gè)錯(cuò)誤是在使用update方法時(shí)發(fā)生的,則是因?yàn)槭褂昧碎_(kāi)放式鎖定,并且在使用Edit方法后記錄發(fā)生了變更。在這種情況下,應(yīng)通知用戶(hù),其他人已經(jīng)改變了數(shù)據(jù)??梢燥@示出當(dāng)前數(shù)據(jù)并讓用戶(hù)選擇:是覆蓋其他用戶(hù)的變更,還是取消編輯
3260不能更新;當(dāng)前,被機(jī)器<name>上的<name>用戶(hù)鎖定鎖定了包含當(dāng)前記錄的頁(yè)面,并使用AddNew或Edlt方法時(shí),就會(huì)發(fā)生這個(gè)錯(cuò)誤。在使用Update方法來(lái)把一個(gè)記錄存儲(chǔ)到一個(gè)鎖定的頁(yè)面時(shí),也會(huì)發(fā)生這個(gè)錯(cuò)誤。在用戶(hù)存儲(chǔ)新的記錄,或者在使用了開(kāi)放式鎖定后,另一個(gè)用戶(hù)又來(lái)鎖定該頁(yè)面時(shí),就會(huì)發(fā)生這種情況。為了處理這個(gè)錯(cuò)誤,可等待一會(huì)兒,然后再試一次存儲(chǔ)該記錄??梢詫⒃搯?wèn)題通知用戶(hù),并讓用戶(hù)決定是否要重試這個(gè)操作

用錯(cuò)誤代碼和出錯(cuò)信息可以測(cè)試記錄是否被鎖定。下面的過(guò)程可用來(lái)檢測(cè)當(dāng)前記錄是否在一個(gè)鎖定的頁(yè)面上:

FunctionRecordLocked(rstAsRecordset)AsBoolean
DimblnLockAsBoolean
OnErrorGoToErrorHandler
blnLock=rst.LockEdits'保存LockEdits屬性的當(dāng)前值
rst.LockEdits=True'設(shè)置保守式鎖定
rst.Edit'試著編輯記錄,如果記錄被鎖定,則會(huì)產(chǎn)生錯(cuò)誤3197
RecordLocked=False
rst.CancelUpdate
rst.LockEdits=blnLock'恢復(fù)LockEdits屬性的值
EXitFUnction
ErrorHandler:
SelectCaseErr
Case3197:
ResumeNext
CaseElse
RecordLocked=True
ResumeNext
EXitFunction
EndSelect
EndFunction

該過(guò)程把記錄集的鎖定設(shè)置為保守式,并編輯記錄,以測(cè)試當(dāng)前記錄是否在一個(gè)被鎖定的頁(yè)面上,如果記錄被鎖定,則會(huì)產(chǎn)生一個(gè)錯(cuò)誤(3197)。該過(guò)程有一個(gè)參數(shù),即rst,它是Recordset對(duì)象。調(diào)用該過(guò)程,將返回一個(gè)布爾值。為了調(diào)用該過(guò)程,可以在窗體上畫(huà)一個(gè)命令按鈕,然后編寫(xiě)如下事件過(guò)程:

bl=RecordLocked(tb)
EndSub

在該事件過(guò)程中,打開(kāi)一個(gè)數(shù)據(jù)庫(kù)和該數(shù)據(jù)庫(kù)中的表,然后用記錄集作為參數(shù)調(diào)用上述過(guò)程,調(diào)用結(jié)果放在變量bl中。如果記錄被鎖定,則返回值為T(mén)rue,否則為False。->


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 建阳市| 岱山县| 华安县| 湖南省| 海原县| 绩溪县| 永州市| 安陆市| 台湾省| 凭祥市| 咸宁市| 安康市| 原阳县| 和平区| 海原县| 鄂尔多斯市| 乐山市| 赣榆县| 盱眙县| 天台县| 二手房| 沧源| 额尔古纳市| 新邵县| 平安县| 彰武县| 瑞昌市| 江西省| 新河县| 图片| 松溪县| 贵州省| 万盛区| 富平县| 洞口县| 蓬安县| 安陆市| 三台县| 正阳县| 聂拉木县| 从化市|