Pages

2013年8月16日 星期五

關於資料庫加鎖的知識


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 意見: