【发布时间】:2013-11-26 22:29:57
【问题描述】:
我有这个问题,还没有找到解决办法:
我有一个包含多个表的应用程序(与大多数应用程序一样)。
其中两个表是:
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 中插入一条记录,在TB_REDEMPTION 中插入大量记录(大约 200-300 条记录)。
当我在代码中标记断点时,在所有插入之后(在两个表中),并且在提交事务之前,无法从另一个数据库连接(甚至直接从SQL*Plus) - 它只是等待!
我们分析了很多东西,发现PK_REDEMPTION(TB_REDEMPTION的主键索引)发生了锁。
如何防止这种锁定?我在网上搜索并没有在插入期间找到任何关于索引锁的信息。
我要提一下,这个应用程序是基于Web的,并且有很多并发用户使用相同的用例,并且一个用户锁定了主键索引,阻止了其他用户的工作,并且对性能影响很差申请。
另外一点,应用是由Spring/Hibernate开发的,所以事务管理由Spring完成,DML语句由Hibernate创建。我们正在使用 Oracle 11g。
【问题讨论】:
-
你确定你的 FK 上有索引吗?您是否启用了休眠跟踪以准确查看正在执行的 SQL 语句?
-
是的,FK 上有索引。
-
有很多 SQL 语句(主要是选择),包括
TB_POLICY上的 1 个插入语句和TB_REDEMPTION上的数百个插入语句,以及TB_REDEMPTION的子表上的数百个.
标签: oracle hibernate indexing database-partitioning database-locking