LockType 屬性
指示編輯過程中對記錄使用的鎖定類型。
設置和返回值
設置或返回以下某個 LockTypeEnum 的值。
常量 說明
adLockReadOnly 預設值,唯讀。無法更改資料。
adLockPessimistic 保守式記錄鎖定(逐條)。提供者執行必要的操作確保成功編輯記錄,通常採用編輯時立即鎖定資料來源的記錄的方式。
adLockOptimistic 開放式記錄鎖定(逐條)。提供者使用開放式鎖定,只在調用 Update 方法時鎖定記錄。
adLockBatchOptimistic 開放式批更新。用於與立即更新模式相反的批更新模式。
說明
打開 Recordset 前設置 LockType 屬性可指定打開時提供者應該使用的鎖定類型。讀取該屬性可返回在打開的 Recordset 物件上正在使用的鎖定類型。Recordset 關閉時 LockType 屬性為讀/寫,打開時該屬性為唯讀。
提供者可能不支援所有的鎖定類型。如果某提供者不支援所需的 LockType 設置,則將替換為其他類型的鎖定。要確定 Recordset 物件可用的實際鎖定功能,請通過 adUpdate 和 adUpdateBatch 使用 Supports 方法。
如果 CursorLocation 屬性被設置為 adUseClient,將不支持 adLockPessimistic 設置。設置不支援的值不會產生錯誤,因為此時將使用支持的最接近的 LockType 的值。
遠端資料服務用法 當在用戶端 (ADOR) 的 Recordset 物件上使用時,LockType 屬性只能設置為 adLockOptimisticBatch。
------------------------------------------------------------------------------------
/********** 加鎖 ***************
設table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
1)排它鎖
新建兩個連接
在第一個連接中執行以下語句
begin tran
update table1
set A=’aa’
where B=’b2’
waitfor delay ’00:00:30’ --等待30秒
commit tran
在第二個連接中執行以下語句
begin tran
select * from table1
where B=’b2’
commit tran
若同時執行上述兩個語句,則select查詢必須等待update執行完畢才能執行即要等待30秒
2)共用鎖
在第一個連接中執行以下語句
begin tran
select * from table1 holdlock -holdlock人為加鎖
where B=’b2’
waitfor delay ’00:00:30’ --等待30秒
commit tran
在第二個連接中執行以下語句
begin tran
select A,C from table1
where B=’b2’
update table1
set A=’aa’
where B=’b2’
commit tran
若同時執行上述兩個語句,則第二個連接中的select查詢可以執行
而update必須等待第一個連接中的共用鎖結束後才能執行 即要等待30秒
3)鎖死
增設table2(D,E)
D E
d1 e1
d2 e2
在第一個連接中執行以下語句
begin tran
update table1
set A=’aa’
where B=’b2’
waitfor delay ’00:00:30’
update table2
set D=’d5’
where E=’e1’
commit tran
在第二個連接中執行以下語句
begin tran
update table2
set D=’d5’
where E=’e1’
waitfor delay ’00:00:10’
update table1
set A=’aa’
where B=’b2’
commit tran
同時執行,系統會檢測出鎖死,並中止進程
SET IMPLICIT_TRANSACTIONS ON --用戶每次必須顯式提交或回滾。否則當用戶斷開連接時,
--事務及其所包含的所有資料更改將回滾
SET IMPLICIT_TRANSACTIONS OFF --自動提交模式。在自動提交模式下,如果各個語句成功
--完成則提交。
--------------------------------------------------------------------------------------
修改前
RS.lock
完成後
RS.unlock
--------------------------------------------------------------------------------------
Sql中游標和加鎖的問題
日期:2000-11-27 15:42:00
出處:ALL ASP
作者:feny
<%
’游標類型
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
’加鎖類型
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4
>%
<% set conn = server.createobject(’adodb.connection’) >%
<% set rsmov = server.createobject(’adodb.recordset’) >%
<% conn.open ’資料來源名稱’, ’sa’, ’ >%
<% rsmov.open sqlmov, conn, adopenkeyset, adlockreadonly >%
游標使用時是比較靈活的,它有時用來描述一個記錄集,有時又是用來描述目前記錄集中某一條記錄的指標。游標主要是用來建立一個關聯式資料庫中行/列關係的一種SQL可利用的訪問格式。與游標有關係的技術術語還有一個叫Bookmark的。如果你選擇的游標方式支援Bookmarks。資料庫將提供有關記錄數目的強大功能。
在上面寫出的那麼多游標方式中,adOpenDynamic是沒有太的用處的,雖然它提供即時顯示資料庫中的記錄的所有更新操作的功能,但是因為並不是所有的資料庫都支援該游標方式,沒有移植性的游標方式對當前錯綜複雜的資料庫來說真是用處不大。
在實際的程式設計中,我相信大家使用得最頻繁的是adOpenStatic方式,當然這種方式的缺點是不能夠就、即時反應出資料庫中內容改變時的狀況。如果要想看到資料庫被其它使用者改變的狀況,可使用adOpenKeyse方式(但是它只能夠反應出被編輯的改變情況,也就是說不能夠反映出新增和刪除記錄的改變情況。)
其實上面的內容大家一般都可以在微軟的技術參考資料中找到,下面來說說在使用這些游標方式和加鎖方式時要注意到的問題。
首先要注意到的是這兩種方式在混合使用時的問題,就是說你同時設置游標方式和加鎖方式。除非你是在使用Access資料庫,一般而言當你混合使用時是並不能夠得到你預期想要的游標方式和加鎖方式的。例如,如果你同時將游標設置為adOpenStatic方式,而將加鎖設置為adLockOptimistic,你將得不到adOpenStatic方式的游標,你這時使用的游標方式將是adOpenKeyset,也就是說你使用ADO的話,它將返回adOpenKeyset的游標。
其次,游標和加鎖的混合使用還會導致ADO返回的不是你想要的加鎖方式,ADO會改變你的加鎖方式。例如,在預設狀態下游標方式是adOpenForwardOnly,在使用這種游標方式的同時如果你使用的加鎖方式為-1(就是讓資料來源來判斷加鎖方式)或則adLockReadOnly,那麼這種混合方式基本上不支援RecordSet的任何方法,也就是說RecordSet的任何方法將返回False(你的recordcount,absoultpage,addnew,delete,update等都會返回-1,-1就是表示不支援該屬性),但是這時如果你使用的是adOpenForwardOnly游標方式和其它的加鎖方式混合,它反而會支持填加,刪除和更新。
0 意見:
張貼留言