準備工作:
SQL>create table lck (a number, b number);
SQL>insert into lck values (1,1);
SQL>insert into lck values (2,2);
SQL>insert into lck values (3,3);
SQL>insert into lck values (4,4);
SQL>insert into lck values (5,5);
SQL>insert into lck values (6,6);
SQL>insert into lck values (7,7);
SQL>commit;
實驗過程:步 驟 Session 14 Session 10 說明 1 SQL> select sid from v$session
where audsid=userenv('SESSIONID');
SID
----------
14SQL> select sid from v$session
where audsid=userenv('SESSIONID');
SID
----------
10獲得當前session的SID 2 SQL> insert into lck values (1000,1001);
1 row created. 未提交 3 SQL> select sid,type,id1,lmode,request from v$lock
where sid in (10,14);
SID TY ID1 LMODE REQUEST
---------- -- ---------- ---------- ----------
14 TX 262153 6 0
14 TM 4145 3 0 因為Session14的DML未提交,因此在v$lock里產(chǎn)生2個鎖,一個為:transaction lock(TX),另一個為:DML/table lock(TM).LMODE=3代表:行排它.LMODE=6代表:對象排它 4 SQL> insert into lck values (1001,1000);
1 row created. 未提交 5 SQL> select sid,type,id1,lmode,request from v$lock
where sid in (10,14);
SID TY ID1 LMODE REQUEST
---------- -- ---------- ---------- ----------
14 TX 262153 6 0
14 TM 4145 3 0SQL> select * from lck;
A B
---------- ----------
1 2
2 4
3 6
4 8
5 3
6 5
7 7
7 rows selected.v$lock中并不會因為對該表的再一次DML且未提交而新生成鎖 6 SQL>update lck set a=2000,b=2001
where a=1;
1 row updated.未提交 7 SQL> select * from lck;
A B
---------- ----------
1 2
2 4
3 6
4 8
5 3
6 5
7 7
1000 1001
1001 1000
9 rows selected.SQL> select sid,type,id1,lmode,request from v$lock
where sid in (10,14);
SID TY ID1 LMODE REQUEST
---------- -- ---------- ---------- ----------
10 TX 327698 6 0
10 TM 4145 3 0
14 TX 262153 6 0
14 TM 4145 3 0v$lock中對另外session10的DML產(chǎn)生了鎖 8 SQL>update lck set a=4000,b=2001
where a=1; session10發(fā)出更新a=1行的SQL后,session14也發(fā)出更新a=1行的SQL,則后者的SQL懸在那里,無法結(jié)束 9 SQL> select event, seconds_in_wait, sid from v$session_wait where sid in (10,14);
EVENT SECONDS_IN_WAIT SID
---------------------------------------------------------------- --------------- ----------
enq: TX - row lock contention 1593 14
SQL*Net message from client 2862 10v$session_wait中可以看到哪個session在等待,等待原因和已經(jīng)等待的時間 10 0 rows updated.
SQL>commit;
Commit complete.只有在session10提交該DML后,session14才執(zhí)行完,但更新為0行 11 SQL> select * from lck;
A B
---------- ----------
1 2
2 4
3 6
4 8
5 3
6 5
7 7
1000 1001
1001 1000
9 rows selected.SQL> select * from lck;
A B
---------- ----------
1 2
2 4
3 6
4 8
5 3
6 5
7 7
1000 1001
1001 1000
9 rows selected.
筆記來源: http://www.adp-gmbh.ch/ora/concepts/lock.html