锁产生的原因:如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁。
同一张表不同SESSION持有不同记录
SQL> create table t1(id int);
Table created.
SQL> create table t2(id int);
Table created.
SQL> select * from t1;
ID
----------
1
2
SQL> select * from t2;
ID
----------
2
1
开始测试:
SESSION 1:
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
48 0 0
SESSION 2:
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
38 0 0
SQL> select * from v$lock where sid in (48,38) and type in ('TM','TX');
no rows selected
SESSION 1:
SQL> update t1 set id=3 where id=1;
1 row updated.
SESSION 2:
SQL> update t1 set id=4 where id=2;
1 row updated.
查看此时行锁情况:
SQL> select * from v$lock where sid in (48,38) and type in ('TM','TX');
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
006EBE84 006EBEB4 48 TM 76908 0 3 0 33 0
006EBE84 006EBEB4 38 TM 76908 0 3 0 15 0
336F4CB0 336F4CF0 48 TX 327711 12767 6 0 33 0
331415AC 331415EC 38 TX 262152 12576 6 0 15 0
SESSION 1:
SQL> update t1 set id=4 where id=2;
此时SESSION 1HANG住:
查看此时行锁信息:
SQL> select * from v$lock where sid in (48,38) and type in ('TM','TX');
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
3500122C 35001258 48 TX 262152 12576 0 6 17 0
006EBE84 006EBEB4 48 TM 76908 0 3 0 68 0
006EBE84 006EBEB4 38 TM 76908 0 3 0 50 0
336F4CB0 336F4CF0 48 TX 327711 12767 6 0 68 0
331415AC 331415EC 38 TX 262152 12576 6 0 50 1
SESSION 2执行:
update t1 set id=3 where id=1;
此时SESSION1报:
SQL> update t1 set id=4 where id=2;
update t1 set id=4 where id=2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
------------------------------------------------------------------------
SESSION 1(48):
SQL> update t1 set id=3 where id=1;
1 row updated.
SQL> update t1 set id=4 where id=2;
update t1 set id=4 where id=2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
SESSION 2 (38):
SQL> update t1 set id=4 where id=2;
1 row updated.
update t1 set id=3 where id=1;
查看trace 文件信息:
Session 38:
sid: 38 ser: 190 audsid: 1440036 user: 91/TEST flags: 0x45
pid: 27 O/S info: user: oracle, term: UNKNOWN, ospid: 5535
image: oracle@june (TNS V1-V3)
client details:
O/S info: user: oracle, term: pts/3, ospid: 5534
machine: june program: sqlplus@june (TNS V1-V3)
application name: SQL*Plus, hash value=3669949024
current SQL:
update t1 set id=3 where id=1
----- End of information for the OTHER waiting sessions -----
Information for THIS session:
----- Current SQL Statement for this session (sql_id=2377z63nmj7ps) -----
update t1 set id=4 where id=2