天天看點

事務的并發性和一緻性(二)

Locking Mechanism(鎖機制)

一、鎖機制的特征

1、Lock mode

要進行DML操作,必須同時擁有共享鎖和排他鎖,而對于DDL操作必須在對應表中沒有任何共享鎖的時候才能夠進行。

  • Exclusive lock mode:排他鎖模式,該模式下隻有一個事務可以獲得鎖;
  • Share lock mode:共享鎖模式,該模式下所有的事務都可以獲得鎖。共享鎖是了避免DDL操作對資料字典進行修改;

2、Lock Conversion and Escalation

  • lock conversion:鎖的轉換,資料庫自動把鎖由低級限制轉換到進階限制;
  • lock escalation:鎖擴充,當一個表中被鎖定的資料行太多,資料庫可以由鎖定行擴充到鎖定該表。但是,這會影響到資料庫的并發性,而且容易産生死鎖,為此資料庫不會自動地對鎖進行擴充。

3、Lock Duration

鎖的保留時間段一般為事務,當一個事務被送出後,資料庫會自動釋放其中所擁有的所有鎖,而rollback操作則會釋放savepoint後所擁有的鎖

4、 Deadlock

所謂死鎖是指,A、B事務分别擁有對方所需要的鎖。當死鎖出現之後,資料庫會自動釋放一方所擁有的鎖,以解除死鎖。

二、Automatic Locks

鎖的種類:

  • DML Locks:保護資料;
  • DDL Locks:保護模式對象的中繼資料;
  • System Locks:保護内部資料庫結構,如資料檔案。Latches,mutexes,internal locks是完全自動的;

1、DML Locks

1.1Row Locks (TX)

INSERT, UPDATE, DELETE, MERGE, or SELECT ... FOR UPDATE statement都會需要行鎖,知道事務commit或rollback.行鎖主要用來服務于隊列機制以阻止兩個事務修改同一行。當一個事務因為執行個體崩潰而結束,則在整個事務被恢複之前,資料塊水準的恢複會使得行可用。如果一個事務獲得了行鎖,則同時該事務也會獲得表級鎖,以避免DDL語句對對應的表的結構進行修改。如下圖:

事務的并發性和一緻性(二)

行鎖被儲存在資料塊的block header中。每個被鎖定的行都會有一個transaction ID儲存在block header中。當一個事務結束的時候,該事務ID會保留在block header中以用來判斷該行是否正在被鎖定。

1.2Table Locks (TM)

INSERT, UPDATE, DELETE, MERGE , SELECT with the FOR UPDATE clause, or LOCK TABLE statement都會需要獲得Table Lock.

Table Locks的種類:

  • Row Share (RS):也叫subshare table lock (SS),該鎖所表示的是該表中有資料行被鎖定,事務将會對該資料行進行更新。該鎖是最低級别的表鎖,具有最高的并發性。
  • Row Exclusive Table Lock (RX):也叫subexclusive table lock (SX),該鎖所表示的是擁有該鎖的事務已經完成了對行資料的更新,或者已經提出了SELECT ...FOR UPDATE語句。該鎖可以由多個事務同時獲得。
  • Share Table Lock (S):允許多個事務同時擁有該鎖,允許多個事務查詢,當隻有在隻有一個事務持有該鎖的時候才允許更新操作。
  • Share Row Exclusive Table Lock (SRX):也叫share-subexclusive table lock (SSX),一次隻有一個事務獲得該鎖,但是其他事務可以查詢,但是不能更新。
  • Exclusive Table Lock (X):該鎖不允許其他事務對鎖定表進行任何DML操作或LOCK TABLE操作。

1.3、Locks and Foreign Keys

當對父表中的參考鍵進行修改(UPDATE、DELETE)的時候,通常會引起對子表的外鍵列值的修改。如果外鍵列中并沒有索引,則子表經常會被全表鎖定,其實隻允許其他事務對子表進行查詢操作。若外鍵列中有索引,則對于外鍵列值的修改跟平常對于子表的更新操作一樣鎖定,不會對于子表進行全表鎖定。

2、DDL Locks

  • Exclusive DDL Locks

Exclusive DDL Locks阻止其他會話獲得該對象的DDL鎖或DML鎖。比如說,正在進行ALTER TABLE語句,其他會話就不能進行DROP TABLE語句,因為前者已經獲得了Exclusive DDL Locks。

  • Share DDL Locks

Share DDL Locks不允許有沖突的DDL語句,但是允許沒有沖突的會話同時獲得同一對象的Share DDL Locks。如兩個會話同時使用create procedure語句,則兩個會話可以同時對同一對象加Share DDL Locks。此時,不允許對該對象添加Exclusive DDL Locks。

  • Breakable Parse Locks

在SQL語句第一次解析過程中,SQL語句會獲得一個Breakable Parse Locks,隻要該語句存在則該鎖就存在。如果SQL語句中的對象被修改或删除了,則該語句對應的shared SQL area(其中包含了文法樹和執行計劃)就會變得無效。

3、System Locks

資料庫使用各種的系統鎖來保護内部資料庫和記憶體。使用者不能對該機制進行使用,該機制由資料庫自動完成。

  • Latches(闩)

Latches是一種用來協調多使用者同時通路同一個資料結構、記憶體和檔案的簡易、低水準的序列化機制。Latches可以在多程序同時通路時,保護記憶體資源避免損壞。比如一下情況:

多個會話同時修改;

被一會話讀,而被另外一個會話寫;

被通路的時候釋放記憶體;

可用Latches來保護SGA中的多個對象。比如說,背景程序,如DBWn、LGWR需要在共享池中配置設定空間來建立資料結構,則會有一個shared pool latch來使這些背景程序可以序列化地對共享池進行操作。配置設定完空間後,其他程序可能會通路共享池的元件,如library cache(如進行硬解析),則會有一個library cache latch來使得這些程序式列化地對library cache進行操作。

Latch不允許會話排隊等待。當一個Latch變得可用的時候,第一個獲得Latch的會話會排他性地通路它。當程序重複請求Latch的時候,latch spinning.若在程序再次發出latch請求前釋放了CPU,則latch sleeping.

通常獲得一個latch是耗費極少時間的。latch的實施依賴于作業系統,特别是是否會出現latch的等待和等待多長時間。

latch的增多意味着并發性的降低。可以通過V$LATCH來檢視詳細的資訊,如每個latch被請求的次數和等待的時間。

  • Mutexes

Mutexes跟Latches有點相似,隻是latch鎖定的是一組對象,而mutexe是單獨一個對象。Mutexes可以降低資源的争用,消耗更少的記憶體,共享伺服器下還可以允許多個會話的并發性操作。

  • Internal Locks

Dictionary cache locks:該鎖鎖定的時間很短,當資料字典緩存中的實體被修改或使用的時候,該鎖就會鎖定這些對象。該鎖保證語句看不到不一緻的對象定義。該鎖可以是共享鎖,也可以是排他鎖。共享鎖在硬解析完成的時候被釋放,而排他鎖在在DDL語句完成了之後被釋放。

File and log management locks:該鎖保護各種各樣的檔案。如控制檔案同一時間隻能被一個程序修改。該鎖同時輔助線上日志檔案的使用與歸檔。當多個執行個體需要在共享模式下加載資料庫或單一執行個體在 exclusive mode下加載資料檔案的時候,資料檔案會被該鎖鎖定。該鎖控制了這些檔案的狀态,而且這些鎖會被持有很長一段時間。

Tablespace and undo segment locks:該鎖控制了表空間是online還是offline,確定隻有一個執行個體對撤銷段進行寫操作。

三、Manual Data Locks

改寫預設值,可以在會話級别或事務級别。會話級别用ALTER SESSION,事務級别可以使用下面語句:

  • SET TRANSACTION ISOLATION LEVEL;
  • LOCK TABLE;
  • SELECT ... FOR UPDATE;

四、使用者自定義的鎖

使用DBMS_LOCK包,可以進行一下操作:

  • 請求一個特别類型的鎖;
  • 給鎖一個唯一的名稱,以便可以在同一個或另外一個執行個體的另外一個程式中識别;
  • 改變鎖的類型;
  • 釋放鎖。

---------------------------------------------------------------------------------------------------

如有錯誤,歡迎指正

技術交流QQ:1732035211

技術交流郵箱:[email protected]

新浪微網誌:資料庫小菜鳥http://weibo.com/u/3132578390