我在合并查询中有这个众所周知的死锁。没有外键,触发器,任何PL / SQL。主表是仅具有复合主键的btree索引。辅助表是临时会话私有的(甚至没有主键)。 多个线程将条目插入到时态表中并调用merge。
这些东西看起来很典型,但我无法对问题来源进行分类。我挖了一篇文章Application design is only reason for。我的案例并不适合任何提到的模式%100。
死锁图中的锁类型看起来像"主键重叠",但我的跟踪有行。虽然有2个循环行,但偶然情况下根本没有行。
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-0006000d-00010e04 24 1432 X 23 2918 S
TX-00270002-00019175 23 2918 X 24 1432 S
session 1432: DID 0001-0017-015A7B2A session 2918: DID 0001-0031-002724EE
session 2918: DID 0001-0031-002724EE session 1432: DID 0001-0017-015A7B2A
Rows waited on:
Session 1432: obj - rowid = 00004061 - AAAEBhAAEABfFCsAAA
(dictionary objn - 16481, file - 4, block - 24924332, slot - 0)
Session 2918: obj - rowid = 00004061 - AAAEBhAAEABfFCsAAA
(dictionary objn - 16481, file - 4, block - 24924332, slot - 0)
在跟踪的第二个片段中,我看到只有1个插槽(已提交并已释放锁定)。根据{{3}}" Lck"意味着根本没有锁定行,那么我看到上面有2行?
Object id on Block? Y
seg/obj: 0x4061 csc: 0x00.24a90627 itc: 1 flg: E typ: 2 - INDEX
brn: 0 bdba: 0x156a730 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.00a.0000d5fb 0x000556a1.13a8.02 C--- 0 scn 0x0000.24a8fa32
Branch block dump