db2資料庫中的鎖和併發性控制
現在的db2 udb系統中, 主要通過鎖和隔離級別這兩個主要的工具來控制併發連線,維護資料庫中的資料在高併發的環境下的安全。
我們在這裡將簡要的闡述一下鎖和隔離級別。
鎖:db2 udb中, 鎖的主要作用物件是表和行, 其他如表空間和索引也是鎖的物件, 但是因為其多為系統控制, 管理員和使用者使用較少,在這裡就不涉及了。
對於行級鎖和表級鎖, 它們的區別不言而喻, 主要是鎖的物件不同。 當然鎖物件的不同連帶也會影響db2的併發能力。
db2中的表級鎖主要有以下幾種:
1. is鎖: 此鎖作用於整個表,表示擁有此鎖的應用連線要讀取表中的某些資料, 但是在此應用連線讀取具體的資料時, 還必須獲得該行的行級鎖;
2. ix鎖: 此鎖作用於整個表,表示擁有此鎖的應用連線需要獨佔使用表中的某些資料, 但是在此應用連線獨佔使用具體的資料時, 還必須獲得該行上相應的行級鎖;
3. six鎖: 此鎖是鎖轉換的產物,表示應用連線擁有s和ix鎖的特性;
4. s鎖: 此鎖作用於整個表, 擁有此鎖的應用連線可以讀取表中的任何紀錄;
5. u鎖: 此鎖作用於整個表, 擁有此鎖的應用連線可以讀取表中的任何紀錄,也可以更新表中的紀錄, 但是更新時需要再獲得x鎖; 此鎖主要在「select … with update」語句建立的可更新游標中起作用, 其他的應用可以讀取表中的紀錄, 但是不能更新它;
6. x鎖: 此鎖作用於整個表, 擁有此鎖的應用連線獨佔的使用表中的任何紀錄;可以進行更新或其他操作;
7. z鎖: 此鎖作用於整個表, 也稱超級獨佔鎖,主要是在象修改表的定義、 刪除表這一類的語句中會使用。 擁有此鎖的應用連線對該錶有完全的控制權。 其他的任何應用不能讀取或更新表中的任何紀錄。
在這裡我們主要要看一下 is/ix/six這三個鎖。 在這三個鎖中is/ix本身並不具備使得應用連線可以讀取或更新紀錄的能力,應用連線要讀取和更新紀錄時, 需要再得到相應的行級鎖; 反之亦然, 任何應用要獲得行級鎖運算元據記錄之前, 也必須獲得某個相應的表級鎖。 six鎖也是類似的情況。這就是為什麼在很多情況下我們使用的是行級鎖, 但是用快照(snapshot)等工具卻能夠看到有表級鎖存在的原因。
那麼db2中又有哪些行級鎖呢? 讓我們來看下面的這張圖:
此圖中列出了db2中包含的行級鎖。 表中的第三列指出, 要獲得此行級鎖之前, 需要預先獲得的表級鎖, 這裡列出的是最低要求。
這六個行級鎖的主要功能如下:
1. s鎖:此行級鎖的擁有者可以讀取該行的資訊;
2. u鎖:此行級鎖的擁有者可以讀取該行的資訊,如果要更新該行,則仍然需要乙個行級的x鎖;其他的應用只能讀取該行的資訊;此鎖主要是用於for update的游標。
3. x鎖:此行級鎖的擁有者可以更新該行的紀錄,其他的應用不能連線此行的資訊;
4. w鎖:此鎖和x鎖類似,不同之處是此鎖和nw鎖相容;
5. ns鎖:類似於s鎖,用於next key;
6. nw鎖:類似於w鎖,用於next key;
在db2資料庫中, 是通過行級鎖和表級鎖協調作用來提供較好的併發性, 同時保證資料庫中資料的安全。 在db2中預設情況下使用行級鎖(當然需要is/ix鎖配合),只有當出現鎖資源不足, 或者是用命令指定使用表級鎖的情況下, 才會在應用連線中使用表級鎖。 對鎖資源分配有興趣的讀者可以參考db2的管理手冊, 查詢其中關於locklist和maxlocks引數的論述。對於用命令指定表級鎖的情況, 可以參考db2的命令手冊中的lock table命令, 此命令用於直接鎖表。
隔離級別:
下面讓我們來看一下隔離級別。 隔離級別主要用於控制在db2根據應用提交的sql語句向db2資料庫中的相應物件加鎖時, 會鎖住哪些紀錄, 也就是鎖定的範圍。 隔離級別的不同, 鎖定的紀錄的範圍可能會有很大的差別。
隔離級別分為rr/rs/cs/ur這四個級別。 下面讓我們來逐一論述:
1. rr隔離級別: 在此隔離級別下, db2會鎖住所有相關的紀錄。 在乙個sql語句執行期間, 所有執行此語句掃瞄過的紀錄都會被加上相應的鎖。 具體的鎖的型別還是由操作的型別來決定, 如果是讀取,則加共享鎖; 如果是更新, 則加獨佔鎖。 由於會鎖定所有為獲得sql語句的結果而掃瞄的紀錄, 所以鎖的數量可能會很龐大, 這個時候, 索引的增加可能會對sql語句的執行有很大的影響,因為索引會影響sql語句掃瞄的紀錄數量。
2. rs隔離級別: 此隔離級別的要求比rr隔離級別稍弱,此隔離級別下會鎖定所有符合條件的紀錄。 不論是讀取, 還是更新, 如果sql語句中包含查詢條件, 則會對所有符合條件的紀錄加相應的鎖。 如果沒有條件語句, 也就是對錶中的所有記錄進行處理,則會對所有的紀錄加鎖。
3. cs隔離級別: 此隔離級別僅鎖住當前處理的紀錄。
4. ur隔離級別:此隔離級別下,如果是讀取操作,不會出現任何的行級鎖。對於非唯讀的操作,它的鎖處理和cs相同。
在這四種隔離級別中, cs是預設值。 這四種隔離級別均可以保證db2資料庫在併發的環境下不會有資料丟失的情況發生。 要注意的是如果對紀錄進行了修改,需要在相應的紀錄上加獨佔型別的鎖, 這些獨佔型別的鎖直到交易結束時才會被釋放, 這一點在四種隔離級別下都是相同的。
DB2資料庫中的鎖和併發性控制
1.引導 現今的應用系統一般都需要相對較強的多使用者同時訪問的能力。作為應用系統基礎的資料庫產品對多使用者能力的支援也就越發重要。現在的db2 udb系統中,主要通過鎖和隔離級別這兩個主要的工具來控制併發連線,維護資料庫中的資料在高併發的環境下的安全。我在這裡將簡要的闡述一下鎖和隔離級別。2.鎖 d...
DB2資料庫與Oracle併發控制 鎖 的大比拼。
以下的文章主要向大家描述的是db2資料庫和oracle的併發控制 鎖 的比較,以下就是對db2資料庫和oracle的併發控制 鎖 的比較的描述,望會對你有所幫助,以下就是文章的主要內容講述。1 引言 在關聯式資料庫 db2,oracle,sybase,informix和sql server 最小的恢...
DB2併發性和事務隔離級別
1.當事務在多使用者環境中沒有彼此隔離時,將會產生以下三種後果 1 髒讀 這種情況發生在乙個事務讀取還未提交的資料時。例如 事務1改變了一行資料,而在事務1提交修改之前事務2讀取了事務1所改變的行的資料。如果事務1回滾了修改,那末事務2就讀取了實際上並不存在的資料。2 不可重複讀 這種情況發生在事務...