我有这个问题,还没有找到解决方案:
我有一个包含多个表的应用程序(就像大多数应用程序一样)。
其中两个表是:
TB_POLICY
---------
id number(18) : PK
... some other columns
TB_REDEMPTION
-------------
id number(18) : PK
fk_policy number(18) : NOT NULL, FK
... some other columns
TB_POLICY
由其某些字段的哈希分区,并通过关系TB_REDEMPTION
上的引用进行分区fk_policy
。
表TB_POLICY
包含约 50,000 条记录,表TB_REDEMPTION
包含约 25,000,000 条记录。
有一个用例,其中应用程序在单个事务中插入一条记录TB_POLICY
和许多记录(大约 200-300 条记录) 。TB_REDEMPTION
TB_REDEMPTION
当我在代码中标记断点时,在所有插入之后(在两个表中),并且在提交事务之前,无法从另一个数据库连接(甚至直接从 SQL*Plus)插入另一条记录- 它只是等待!
我们分析了很多东西,发现在PK_REDEMPTION
(的主键索引TB_REDEMPTION
)上发生了锁。
我怎样才能防止这个锁?我在网上搜索并没有在插入过程中找到任何关于索引锁的信息。
需要提一下,这个应用程序是基于web的,有很多并发用户使用同一个用例,并且一个用户锁定了主键索引,阻止了其他用户的工作,对应用程序的性能影响很差。
还有一点,应用是Spring/Hibernate开发的,所以事务管理是Spring做的,DML语句是Hibernate创建的。我们正在使用 Oracle 11g。