ADO如何鎖定RecordSet的記錄呢?
發(fā)表時間:2024-02-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]前面介紹使用Recordset(記錄集合)對象的方法如下: Set rs = Server.CreateObject("ADODB.Recordset") rs.Open SQL指令, Conn, 1, 1 ‘讀取 rs.Open SQL指令, Conn, 1, 3 ‘新增、修...
前面介紹使用Recordset(記錄集合)對象的方法如下:
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL指令, Conn, 1, 1 ‘讀取
rs.Open SQL指令, Conn, 1, 3 ‘新增、修改、或刪除
到底rs.Open后接的第三個參數(shù)1和第四個參數(shù)是什么意思呢?為何第四個參數(shù)在讀取時要用1,新增、修改、或刪除時要用3呢?
第三個參數(shù)表示cursor類型;
第四個參數(shù)表示RecordSet的鎖定型態(tài)。
詳細介紹如下:
RecordSet的鎖定
當(dāng)開啟Recordset對象時,您也可以用LockType屬性指定鎖定的型態(tài):
1:唯讀(ReadOnly),不允許更新,為預(yù)設(shè)值。
2:悲觀鎖定( Pessimistic lock),在編輯Recordset資料或使用AddNew方法,一開始執(zhí)行就立即鎖定此記錄或包含資料記錄的資料頁,并維持鎖定直到使用Update方法將變更寫回到資料庫為止。
3:樂觀鎖定(Optimistic lock),使用Update方法將變更寫回到資料庫時才鎖定此記錄。
4:批次樂觀鎖定(Batch Optimistic lock),使用UpdateBatch方法將多筆變更的記錄批次寫回到資料庫時,才鎖定此批記錄。
當(dāng)您使用悲觀鎖定(Pessimistic Lock)時,一旦編輯Recordset資料或呼叫了AddNew方法時,就會鎖定包含目前編輯RecordSet的資料對應(yīng)頁,直到明確地確認(Commit)或取消這個RecordSet的變更后,它才會釋放這個鎖定。
悲觀鎖定的主要優(yōu)點,是取得鎖定之后,只要RecordSet還被鎖定著,就不會發(fā)生任何鎖定沖突。由于一個使用者開始編輯RecordSet后,其他使用者就無法改變它,所以悲觀鎖定是保證應(yīng)用程式能讀取到目前最新資料的唯一方法。
悲觀鎖定的缺點,是在編輯和鎖定該RecordSet當(dāng)中,包含該RecordSet的整個資料對應(yīng)頁都會被鎖定。如果當(dāng)使用者開始編輯和鎖定RecordSet后,在RecordSet被鎖定期間過了很久才明確地確認(Commit)或取消這個RecordSet的變更,就將產(chǎn)生一個問題,這不僅鎖定了使用者正在編輯的RecordSet,而且還可能會鎖定存在該被鎖定資料對應(yīng)頁內(nèi)其它的RecordSet。
當(dāng)您使用樂觀鎖定(Optimistic Lock)時,只會在使用Update方法變更RecordSet時,才鎖定該資料對應(yīng)頁,所以能使鎖定的時間為最短,這是樂觀鎖定的主要優(yōu)點。
樂觀鎖定的缺點,是當(dāng)使用者開始編輯RecordSet時,無法確定更新是否會成功。如果另一個使用者改變了第一個使用者正在編輯的RecordSet,那么建立在樂觀鎖定的更新將會失敗。
譬如甲和乙都在編輯相同的RecordSet,若甲開始以樂觀鎖定編輯一個RecordSet,因為甲使用的是樂觀鎖定,并沒有真正鎖定該RecordSet,所以無法禁止乙嘗試編輯相同的RecordSet。
于是乙開始編輯相同的RecordSet。但是,乙也不知道甲正在編輯該RecordSet,也看不到最新的資料。
因為乙也正在編輯該資料錄,所以當(dāng)甲嘗試儲存他的變更時,就會收到一個錯誤。
當(dāng)您使用異動(transaction)功能時,樂觀鎖定將會轉(zhuǎn)換成悲觀鎖定。因為在你做交易確認(Commit)之前,異動一直會做寫入鎖定
(Write-Lock)的功能,所以轉(zhuǎn)換成悲觀鎖定。
樂觀更新(optimistic update)是逐筆記錄進行的。您可以讓使用者能在自己的電腦中,暫存(cache)多筆記錄的變更,然后使用批次處理,一次把這些多筆變更的記錄傳給伺服器進行更新,這樣效率比較高。這個方式稱為批次樂觀更新(Batch Optimistic Update)。
批次樂觀更新使用的鎖定方式為批次樂觀鎖定(Batch Optimistic lock),使用UpdateBatch方法將多筆變更的記錄批次寫回到資料庫時,才鎖定此批資料記錄。
在Recordset對象上設(shè)定鎖定時,如果鎖定失敗,則會產(chǎn)生錯誤。
譬如有另一個使用者以鎖定的模式,開啟了Recordset對象時,那么當(dāng)您嘗試鎖定該Recordset對象時,就會發(fā)生錯誤。
錯誤可能為:
3260:RecordSet被鎖定。在您遇到這個錯誤時,可以先等待一下,然後再重試一次。 3262:無法鎖定資料表 <name>,目前正被使用者<name>在機器<name>上使用。先等待一下,然后再重試一次。
3197:RecordSet的資料在被開啟之后發(fā)生了改變。因為您和另一個使用者嘗試同時改變同一筆資料,可以再試一下重新讀取該RecordSet,以取得最新的資料。
3186:無法儲存,目前正被機器 <name> 上的 <name> 使用者鎖定。當(dāng)一個使用者嘗試更新一資料對應(yīng)頁,而且該頁被另一個使用者鎖定時,就會發(fā)生這個錯誤。要處理這個錯誤,則先等待一會兒,然后重新儲存該RecordSet。
3260:無法更新,目前,被機器 <name> 上的使用者 <name> 鎖定。當(dāng)您編輯Recordset資料或呼叫了AddNew方法,而該資料對應(yīng)頁包含有被鎖定的記錄時,就會發(fā)生這個錯誤要處理這個錯誤,先等待一會兒,然后再一次儲存該RecordSet。或者您可以通知遇到這個問題的使用者,并允許使用者選擇是否要再重試這個操作。
cursor
cursor(資料指標(biāo))是一個指標(biāo)或指標(biāo)的集合,它指向根據(jù)某條件從資料庫中取回的資料。cursor的特性如下:
可以表示單一資料表中的部份或全部RecordSet。
可以表示多資料表的連結(jié)(join)中的部份或全部RecordSet。
可以表示沒有RecordSet。
在cursor層次上或者在資料欄層次上,cursor可以是只讀的或可更新的。
cursor既可以雙向移動(表示在RecordSet中能向前或向后移動),又可以是僅向前移動。
cursor可以存在用戶端的電腦中,也可以存在服務(wù)器上。
cursor所在位置
cursor需要暫存的資源來儲存資料,這些資源為RAM、虛擬記憶體、暫存檔或資料庫。如果這些資源在用戶端的電腦中,cursor就稱為client-side(客戶端)cursor。對於這種類型的cursor,服務(wù)器將cursor所代表的資料和cursor自身需要的資料傳到用戶端,由用戶端電腦來管理暫存的資源。
另外一種類型的cursor,稱為server-side(服務(wù)器端)cursor。對於這種類型的cursor,使用
服務(wù)器上的暫存資源來管理RecordSet對象。對於server-side cursor,只有由cursor選中的RecordSet才透過網(wǎng)路傳送給用戶端的電腦。因此在網(wǎng)路通訊或頻寬出現(xiàn)問題時,使用這種類型的cursor在性能上有很大的提升。但是,因為需要服務(wù)器上的RAM和磁碟空間等資源,因此必須保證服務(wù)器有足夠資源來管理所有客戶端電腦請求的cursor。
CursorLocation屬性,可以選擇cursor的所在位置,是在用戶端電腦還是服務(wù)器上:
3:使用用戶端cursor。此選項對小的RecordSet效果較好,但對大的結(jié)果集,其性能迅速下降。
2:使用服務(wù)器cursor。對於大多數(shù)的大型作業(yè)來說,這種類型的cursor有較好的性能。
cursor類型
當(dāng)開啟Recordset對象時,可以在CursorType屬性指定不同的cursor類型:
0:Forward-only(只向前):只能向前移動,這是缺省值。
1:Keyset(索引鍵集)
2:Dynamic(動態(tài))
3:Static(靜態(tài))
如果應(yīng)用程式只需要讀取一個RecordSet,并不需要做新增、修改、刪除的動作,那么用Forward-only(只向前)的Recordset對象,可以明顯提高應(yīng)用程式的執(zhí)行性能。
需注意使用Forward-only(只向前)的Recordset時,下面的方法和屬性將無法使用:
Bookmark屬性
Clone方法
Move方法
MoveFirst方法
MoveLast方法
MovePrevious方法
OpenRecordset方法(出處:熱點網(wǎng)絡(luò))