僵局的根本原因?

时间:2016-12-14 12:24:27

标签: oracle deadlock trace

我在下面看到了oracle 12g跟踪文件中检测到的死锁之一的详细信息,但我不知道为什么会发生死锁?

当线程1获取对table1或table行的锁定但等待表2行并且同时线程2获取表2行上的锁定等待table1行时发生死锁

但我没有看到哪个会话获取锁定哪个表并等待哪个资源的详细信息。任何帮助什么是锁定在这里的对象 它的原因?

Deadlock graph:
                                          ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name                             process session holds waits  process session holds waits
TX-00290010-00015F75-00000000-00000000        295    1200     X            288       10           X
TX-00570012-00005D9B-00000000-00000000        288       10     X            295    1200           X

session 1200: DID 0001-0127-00014421    session 10: DID 0001-0120-00016BD1 
session 10: DID 0001-0120-00016BD1  session 1200: DID 0001-0127-00014421 

Rows waited on:
  Session 1200: obj - rowid = 00051348 - BABRNIAARAAKfNLAAl
...
  Session 10: obj - rowid = 000514F2 - BABRTyAAJAAKWbIAAY
....

----- Information for the OTHER waiting sessions -----
....
  current SQL:
  update employee set name=:1 
----- End of information for the OTHER waiting sessions -----

Information for THIS session:

----- Current SQL Statement for this session (sql_id=5dfr2prw60rh1) -----
update department set address =:1 where id=:1 
===================================================

1 个答案:

答案 0 :(得分:0)

您的输出显示当前会话正在尝试更新部门表中的锁定记录(“此会话的信息”输出)。另一个会话正在尝试更新每个员工记录(“其他等待会话的信息”输出)。当前会话必须更新employee表中的记录,阻止其他会话,而另一个会话更新当前会话尝试更新的记录。

我认为这是导致死锁的一种练习,因为您将每个员工记录设置为相同的名称。