oracle沒有鎖管理器和鎖列表,這樣可以避免行級鎖維護的開銷和行級鎖數量不足導致的爭用問題。在Oracle的每行數據上,都有一個標志位來表示該行數據是否被鎖定,要查看某一行是否被鎖定,必須直接找到這一行,而不要指望能從哪個列表得到答案,事務只是找到數據。其locking過程如下:
㈠ 找到想鎖定的那一行的地址
㈡ 到達那一行
㈢ 鎖定這一行
在這行的位置,而非某個鎖列表。如果這一行已經鎖定,則等待鎖定它的事務結束,除非使用nowait選項。
保護元數據---->TM鎖(表級鎖)
保護數據 ---->TX鎖(事務鎖)
v$lock列:ID1、ID2
對TM鎖,ID1表示被locking對象的object_id,ID2始終為0
對TX鎖,ID1表示該事務的xidusn、xidslot,ID2表示xidsqn
對ID1的拆解:
14:14:56 hr@ORCL (^ω^) select id1,id2,type from v$lock where type='TX'; ID1 ID2 TYPE ---------- ---------- ---- 524320 1748 TX 14:16:56 hr@ORCL (^ω^) select 524320/65536 xidusn,mod(524320,65536) xidslot from dual; XIDUSN XIDSLOT ---------- ---------- 8.00048828 32
事務鎖不是行級鎖。行級鎖觸發事務鎖。一個事務只有一個事務鎖,但可以有多個行級鎖。TX鎖用作一種排隊機制:請求鎖的事務會排隊,等待目前持有鎖的事務執行,然后得到數據。
事務中DML或select ...for update都會得到一個TX鎖。
session 1:scott
SQL> update dept set dname=initcap(dname);
已更新4行。
SQL> select username,l.sid,trunc(id1/power(2,16)) xidusn,bitand(id1,to_number('ffff','xxxx'))+0 slot,
2 id2 sqn,lmode,request
3 from v$lock l,v$session s
4 where l.type='TX' and
5 l.sid=s.sid and
6 s.username=USER
7 /
USERNAME SID XIDUSN SLOT SQN LMODE REQUEST
---------- ---------- ---------- ---------- ---------- ---------- ----------
SCOTT 154 10 40 1395 6 0
SQL> select xidusn,xidslot,xidsqn from v$transaction;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
10 40 1395
注釋:
① v$lock表中lmode=6為X鎖(排他表級鎖)。request=0則意味著你擁有這個鎖
② oracle不會在任何地方存儲行級鎖列表。所以v$lock表只有一行,而不是四行
session 2:也是scott
SQL> update emp set ename=upper(ename);
已更新14行。
SQL> update dept set deptno=deptno-10;
現在會話被阻塞。
SQL> select username,l.sid,trunc(id1/power(2,16)) xidusn,bitand(id1,to_number('ffff','xxxx'))+0 slot,
2 id2 sqn,lmode,request
3 from v$lock l,v$session s
4 where l.type='TX' and
5 l.sid=s.sid and
6 s.username=USER
7 /
USERNAME SID XIDUSN SLOT SQN LMODE REQUEST
---------- ---------- ---------- ---------- ---------- ---------- ----------
SCOTT 135 10 40 1395 0 6
SCOTT 135 2 1 1777 6 0
SCOTT 154 10 40 1395 6 0
SQL> select xidusn,xidslot,xidsqn from v$transaction;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
2 1 1777
10 40 1395
這里可以看到一個新的事務,xid為(2,1,1777)。request=6表明對一個X鎖的請求。請求行的xid正是持有
者的事務ID。
SQL> select (select username from v$session where sid=a.sid) blocker,a.sid,
2 'is blocking',
3 (select username from v$session where sid=b.sid) blockee,b.sid
4 from v$lock a,v$lock b
5 where a.block=1 and
6 b.request>0 and
7 a.id1=b.id1 and
8 a.id2=b.id2
9 /
BLOCKER SID 'ISBLOCKING' BLOCKEE SID
---------- ---------- ---------------------- -------- ----------
SCOTT 154 is blocking SCOTT 135
表級鎖(table-level lock)的作用是對并發的 DDL 操作進行訪問控制,例如防止在 DML 語句執行期間相關的表被移除。當用戶對表執行 DDL 或 DML 操作時,將獲取一個此表的表級鎖。表級鎖不會影響其他并發的 DML操作。對于分區表來說,表級鎖既可以針對整個表,也可以只針對某個分區。
當用戶執行以下 DML 語句對表進行修改:INSERT,UPDATE,DELETE,及 SELECT ... FOR UPDATE,或執行 LOCK TABLE 語句時,事務將獲取一個表級鎖。當一個未提交的事務擁有某個表上的鎖時,此表就無法被修改定義或被移除。
大家都知道TM鎖共有6種模式,最常見的是3(插入,更新,刪除);4(創建索引時);5(部分DDL操作如:刪除列)等等
RS
行共享表級鎖(row share table lock)(也稱為 subshare table lock,SS)表明擁有此鎖的事務已經鎖定了表內的 某些數據行,并有意對數據行進行更新操作。當執行以下 SQL 語句時將獲得表上的行共享表級鎖:
SELECT ... FROM table ... FOR UPDATE OF ... ;
OR
LOCK TABLE table IN ROW SHARE MODE;
RS限制程度最低,因而能夠保證表的最大的并發訪問能力
允許的操作:某個事務擁有了某個表的行共享表級鎖后,其他事務依然可以并發地對相同數據表執行查詢,插入,更新,刪除操作,或對表內數據行加鎖的操作.
禁止的操作:LOCK TABLE table IN EXCLUSIVE MODE
RX
行排他表級鎖(row exclusive table lock)(也被稱為 subexclusive table lock, SX)通常表明擁有此鎖的事務已經對表內的某些數據行進行了更新操作。當事務使用以下語句修改數據表時將自動地獲得行排他表級鎖:
INSERT INTO table ... ;
or
UPDATE table ... ;
or
DELETE FROM table ... ;
or
LOCK TABLE table IN ROW EXCLUSIVE MODE;
RX比RS限制程度略高。
允許的操作:某個事務擁有了某個表的行排他表級鎖后,其他事務依然可以并發地對相同數據表執行查詢,插入,更新,刪除操作,或對表內數據行加鎖的操作。
禁止的操作:
LOCK TABLE table IN SHARE MODE;
or
LOCK TABLE table IN SHARE EXCLUSIVE MODE;
or
LOCK TABLE table IN EXCLUSIVE MODE;
S
以下語句能夠獲得表上的共享表級鎖(share table lock):
LOCK TABLE table IN SHARE MODE;
注意,在創建索引時,會缺省地加上S鎖。7*24業務這條語句(等價于建索引)會使得所有DML都被阻塞!!
允許的操作:某個事務擁有了某個表的S鎖后,其他事務可以查詢表,可以使用 SELECT ... FOR UPDATE語句鎖定選中的數據行,也能夠成功執行 LOCK TABLE ... IN SHARE MODE 語句。多個事務可以并發地獲得同一個表上的S鎖,在此種情況下任何事務都不能對表進行更新。擁有S鎖的事務只有在此表上沒有其他事務的S鎖時,才能對表進行更新操作。
禁止的操作:
LOCK TABLE table IN ROW EXCLUSIVE MODE;
OR
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
OR
LOCK TABLE table IN EXCLUSIVE MODE;
SRX
共享行排他表級鎖(share row exclusive table lock)(也稱為 share-subexclusive table lock,SSX)與S鎖相比限制更為嚴格。用戶可以使用以下語句獲得SRX:
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
允許的操作:同一時間只有一個事物能夠獲得表的共享行排他表級鎖。某個事務擁有了某個表的共享行排他表級鎖后,其他事務可以查詢表,可以使用SELECT ... FOR UPDATE 語句鎖定選中的數據行,但不能對表進行更新操作。
禁止的操作:
LOCK TABLE table IN ROW EXCLUSIVE MODE;
or
LOCK TABLE table IN SHARE MODE;
or
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
or
LOCK TABLE table IN EXCLUSIVE MODE;
X
排他表級鎖(exclusive table lock)是限制程度最高的表級鎖,她能使獲得此鎖的事務排他地對表進行寫操作。排他表級鎖可以使用以下語句獲得:
LOCK TABLE table IN EXCLUSIVE MODE;
允許的操作:同一時間只有一個事務能獲得表上的X鎖。一個事務獲得X后,其他事務只能對表進行查詢操作。
禁止的操作:一個事務獲得X鎖后,將禁止其他事務對表執行任何 DML 操作,其他事務也無法獲取表上任何類型的鎖。
限制程度表
lmode | type |
2 | RS |
3 | RX |
4 | S |
5 | SRX |
6 | X |
當TM鎖獲得后,系統會自動申請TX鎖,并將實際locking的行級鎖的鎖標志位置位(指向該TX鎖)。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
