Oracle鎖1:DML鎖,oracle鎖1dml

來源:互聯網
上載者:User

Oracle鎖1:DML鎖,oracle鎖1dml
DML鎖,也叫做資料鎖(data lock),用於保證在多使用者操作資料時資料的完整。DML鎖防止相互衝突的DML和DDL操作同時發生。

DML鎖有行鎖(Row Locks,TX)和表鎖(Table Locks,TM),不同的DML操作會自動請求對應的鎖。

行鎖(Row Locks,TX)
行鎖也叫TX鎖,用於鎖表的一行資料。當一個事務對一行資料做INSERT、UPDATE、DELETE、MERGE或SELECT ... FOR UPDATE操作時,資料將為行添加行鎖,直到事務執行了commit或roll back操作後,行鎖才釋放。
行鎖防止兩個事務修改同一行資料,當一個事務修改一行資料時,資料庫總是為修改的行加一個排它鎖以至於其它事務無法修改該行,只有當事務執行了commit或者roll back操作後,資料庫才會釋放對應的鎖。行鎖是小粒度的鎖,為應用提供了最大限度的並行修改資料的能力。
當一個事務擷取了一個行鎖,那麼這個事務也需要擷取這行資料所在表的表鎖,表鎖阻止有衝突的DDL操作,即資料庫會自動的為更新的行添加一個排它鎖,並為行所在的表添加一個子排它鎖。
行鎖和並發
下面通過一個例子來理解行鎖和並發的關係。
首先建立下面的表格,並初始化資料:
create table employees(employee_id number(10),salary number(10));insert into employees(employee_id,salary) values(100,512);insert into employees(employee_id,salary) values(101,600);......
步驟一:三個Session同時查詢ID為100和101的僱員,查詢結果一致
Session 1:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101600Session 2:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101600Session 3:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101600
步驟二:Session 1執行更新操作,更新id為100的僱員,在這個更新中,寫者將請求一個行鎖,阻止其它寫者更新這行資料,如果其它寫者更新該行資料將被阻塞,直到Session 1提交或者復原資料
Session 1:update employees set salary = 612 where employee_id = 100
步驟三:再次執行步驟一的操作
Session 1:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100612101600Session 2:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101600Session 3:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101600
Session 1的結果是它更新後的資料,而其他兩個session任然是舊資料。
步驟四:Session 2更新101僱員的薪水,並且不提交資料,這樣Session 2擷取了對僱員101的行鎖
UPDATE hr.employees SET salary = salary + 100 WHERE employee_id = 101;
步驟五:再次執行步驟1的查詢
Session 1:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100612101600Session 2:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101700Session 3:SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);EMPLOYEE_IDSALARY-------------------------100512101600
行鎖的儲存
Oracle將鎖資訊儲存在data block中。資料庫用一個隊列機制處理行鎖請求,如果一個事務請求一個未鎖定的行,那麼事務將放一個鎖到data block,被事務修改的每一行都指向儲存在block header中的事務ID的一個拷貝。
當一個事務結束時,事務ID保留在block header中,如果另一個事務想修改一行資料,那麼它用這個事務ID判定這個鎖是否是啟用的。如果鎖是啟用的,那麼當鎖被釋放時,該事務的session將被通知,否則,事務擷取這個鎖。
表鎖(Table Locks,TM)
表鎖,也叫TM鎖,當對錶執行以下操作時將被請求:INSERT、UPDATE、DELETE、MERGE、SELECT ... FOR UPDATE和LOCK TABLE。請求表鎖的DML操作將阻止其它衝突的DDL操作。
表鎖有以下的模式:
Row Share(RS)
該鎖也叫subshare table lock(SS),表示事務持有表上的鎖鎖定表中的行,並打算對其進行更新。Row share鎖是最小限制的表鎖,為表的行資料的高並發修改提供了支援。
Row Exclusive Table Lock(RX)
該所也叫subexclusive table lock(SX),通常表示持有鎖的事務更新了表的行或者執行了SELECT ... FOR UPDATE。SX鎖允許其它事務查詢、插入、更新、刪除或者在同一個表上鎖定多行資料,因此,SX鎖允許多個事務在同一個表上同時擷取SX和RS鎖。
Share Table Lock(S)
一個事務持有了表的S鎖,任然允許其他事務查詢該表格(除了用SELECT ... FOR UPDATE),但只有持有了S鎖的事務被允許更新表格。由於多個事務可以同時持有S鎖,擷取S鎖並不能保證事務能夠修改表格。
Share Row Exclusive Table Lock(SRX)
該鎖也叫share-subexclusive table lock(SSX),比S鎖限制更強。在一個表上一個時間點只能有一個事務能擷取SSX鎖。SSX鎖允許其它事務查詢表(除了用SELECT ... FOR UPDATE),但是不能更新表。
Exclusive Table Lock(X)
這個鎖限制最強,禁止其它事務執行任何類型的DML操作或對錶防止任何鎖。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.