如果你有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁(deadlock)。例如,
如果我的数据库中有两个A和B,每个表都只有一行,就可以很容易地展示什么是死锁。
我要做的知识打开两个回话(例如,两个SQL*PLUS会话).在会话A中更更新A表,在会话B中更新B。
现在,如果我想在会话B中更新A,就会堵塞。会话A已经锁定了这一行,这不是死锁:只是堵塞而已。
如果我再回到会话A,试图更新表B,这就会导致一个死锁。要在这个会话中选择一个作为牺牲品,
让它的语句回滚。
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
35 0 0
SQL> create table t3(id int);
Table created.
SQL> insert into t3 values(1);
1 row created.
SQL> insert into t3 values(2);
1 row created.
SQL> commit;
Commit complete.
SQL> update t3 set id=10 where id=1;
1 row updated.
SQL> update t3 set id=30 where id=2;
update t3 set id=30 where id=2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
###############################################################
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
36 0 0
SQL> update t3 set id=20 where id=2;
1 row updated.
SQL> update t3 set id=40 where id=1;
hang-------
查看trace 文件:
----- Information for the OTHER waiting sessions -----
Session 36:
sid: 36 ser: 145 audsid: 1531179 user: 91/TEST flags: 0x45
pid: 28 O/S info: user: oracle, term: UNKNOWN, ospid: 29718
image: oracle@june (TNS V1-V3)
client details:
O/S info: user: oracle, term: pts/0, ospid: 29714
machine: june program: sqlplus@june (TNS V1-V3)
application name: SQL*Plus, hash value=3669949024
current SQL:
update t3 set id=10 where id=1
----- End of information for the OTHER waiting sessions -----
Information for THIS session:
----- Current SQL Statement for this session (sql_id=27jv5jpf0wh5z) -----
update t3 set id=20 where id=2