迟到了,我一直面临着很多行锁争用。争用的表似乎是一个特定的表。
这通常会发生 -
- 开发人员 1 从 Oracle Forms 前端屏幕启动事务
- 开发人员 2 从使用相同屏幕的不同会话开始另一个事务
大约 5 分钟后,前端似乎没有响应。检查会话显示行锁争用。每个人都抛出的“解决方案”是杀死会话:/
作为数据库开发人员
- 可以做些什么来消除行锁争用?
- 是否有可能找出存储过程的哪一行导致这些行锁争用
- 减少/避免/消除此类编码问题的一般准则是什么?
如果这个问题感觉太开放/信息不足,请随时编辑/让我知道 - 我会尽力添加一些额外的信息。
有问题的表有很多插入和更新,我会说它是最繁忙的表之一。SP 相当复杂——为了简化——它从各种表中获取数据,将其填充到工作表中,在工作表上发生大量算术运算,并将工作表的结果插入/更新到相关表中。
数据库版本是 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit。逻辑流在两个会话中以相同的顺序执行,事务不会保持打开太久(或者至少我认为是这样),并且锁定发生在事务的主动执行期间。
更新:表格行数比我预期的要多,大约 310 万行。此外,在跟踪会话后,我发现该表的几个更新语句没有使用索引。为什么会这样——我不确定。where 子句中引用的列已编入索引。我目前正在重建索引。