MaxDB有關鎖機制

orchidllh發表於2005-06-22

Locks

Use

原理上,多個程式可以在同一時間獲得相同的資料庫物件,比如同一個表。資料庫系統使用鎖同步並行操作和隔離單獨的程式。


鎖的型別:

Name

Objects that can be locked

Shared lock (SHARE LOCK)

共享鎖

表、行、資料庫目錄

Exclusive lock (EXCLUSIVE LOCK)

排他鎖

表、行、資料庫目錄

Optimistic Lock

Activities

請求鎖

行級或者表級的鎖可以通過資料庫系統被隱式的請求或者釋放,或者顯示的被使用者請求或者釋放。對資料庫目錄的鎖都是通過資料庫系統隱式的請求和釋放的。

可以使用隔離級別決定什麼時候什麼型別的鎖被設定,決定程式的並行度和將會出現的現象。可以在資料庫的session啟動的時候定義隔離級別,如果沒有定義,則使用預設值。

依賴於隔離級別,資料庫系統在執行sql語句的時候申請必須的鎖。Sql語句在執行改變資料的操作(insertupdatedelete)的時候程式申請一個排他鎖。

使用鎖語法,也可以顯示的為程式或者表中單獨的行申請鎖,通過在sql語句中定義一個LOCK選項,這個可以在任何的隔離級別,可以使用LOCK選項臨時的為某些sql語句覆蓋隔離級別

如果同一個程式在一個表中申請了太多的行級鎖,資料庫系統會試圖設定一個表級鎖在該表上,可以定義在有多少行級鎖的時候系統轉換成表級鎖,通過配置MAXLOCKS引數(普通資料庫引數)。

釋放鎖

Type of Lock

Release

通過使用LOCK語法顯示的釋放

資料庫系統在程式結束的時候釋放鎖。除了以下的情況:

COMMIT或者ROLLBACK命令執行結束程式並且包含一個LOCK語法。

隱式設定共享鎖

依賴於隔離級別

隱式設定排他鎖

變更行排他鎖

通過SQL語句修改資料申請的排他鎖

表鎖

在程式中沒有釋放,但是在整個程式結束的時候釋放

沒有被修改的行上的排他鎖

行上的共享鎖

可以通過UNLOCK語法被釋放

可以通過REQUEST_TIMEOUT(特別資料庫引數)限制使用者等待一個鎖被釋放的時間,當這個時間超時的時候,會產生一個資料庫系統的提示,可以根據該提示進一步處理。

顯示鎖的資訊

可以檢視鎖的資訊:

LOCKS系統表包含了有關鎖的資訊;

LOCK_HOLDER系統表;

LOCK_REQUESTOR系統表

LOCK_WAITS包含了有關鎖等待的資訊。

(這些系統表的所有者是DOMAIN使用者)

現象

如果很多的程式同時訪問相同的資料庫物件,比如表,會在結果集上出現互相矛盾的情況,會出現以下的現象:

髒讀:

程式 T1修改一個行。程式T2在程式T1提交之前讀這個行,然後T1執行了回滾操作,這個時候T2讀取的資料實際上是不存在的。

不可重複讀

程式T1讀一個行,程式T2修改或者刪除了該行且提交了程式。如果隨後T1再讀該行,則T1返回改變的行或者提示行不存在。

Phantom

程式T1執行一個有查詢條件的SQL語法S,返回結果集M。程式T2增加或修改資料使至少一新行滿足S的查詢條件,如果T1再執行S,則新的結果集和M是不同的。

通過設定 隔離級別決定哪種現象是可以接受的:.

Relationship between the 隔離級別 and phenomena

Phenomena

隔離級別

0

1 or 10

2 or 20

3 or 30

Dirty Read

yes

no

no

no

Non Repeatable Read

yes

yes

no

no

Phantom

yes

yes

yes

no

並行鎖

下表顯示在並行操作中存在哪些共享鎖和排他鎖:

A transaction has..

For a table

For a row

For the database catalog

Another transaction can...

Exclusive lock

Shared lock

Exclusive lock

Shared lock

Exclusive lock

Shared lock

Request an exclusive lock for the table

no

no

no

no

no

yes

Request a shared lock for the table

no

yes

no

yes

no

yes

Request an exclusive lock for any row in the table

no

no

-

-

no

yes

Request an exclusive lock for the locked row

-

-

no

no

-

-

Request an exclusive lock for a different row

-

-

yes

yes

-

-

Request a shared lock for any row in the table

no

yes

-

-

no

yes

Request a shared lock for the locked row

-

-

no

yes

-

-

Request a shared lock for a different row

-

-

yes

yes

-

-

Change the definition of the table in the database catalog

no

no

no

no

no

no

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/51862/viewspace-180645/,如需轉載,請註明出處,否則將追究法律責任。

相關文章