Oracle死锁检测工具
Posted
技术标签:
【中文标题】Oracle死锁检测工具【英文标题】:Oracle deadlock detection tool 【发布时间】:2009-05-13 06:20:51 【问题描述】:我正在寻找 Oracle 查询和 PL/SQL 过程(触发器、约束等)的静态分析器 - 一种将传递我们的 DB 方案并指出潜在死锁的工具。就像 Java 的 FindBugs。
如果没有这样的工具,你想要吗?
【问题讨论】:
【参考方案1】:从 10g 开始,数据库现在内置了一个静态 PL/SQL 分析器:
ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL';
有一个 PLSQL_WARNINGS 的谷歌,你会发现一些有用的参考资料
虽然我同意 Matthew 的观点,但您不太可能找到能够特别有效地检测死锁的分析器......有太多变量在起作用。
【讨论】:
【参考方案2】:TOAD 有一些静态分析(或至少某种代码质量)工具。不过我怀疑他们能否找到死锁。
【讨论】:
【参考方案3】:死锁取决于事务而不是静态代码。 Oracle 中没有“BEGIN TRANSACTION”语句的概念,因此静态分析器无法知道事务的起点是什么。 假设,可以编写一个分析器,如果给定一个起始 SQL 或 PL/SQL 语句,它可以跟踪所有潜在的执行路径并确定哪些表以什么顺序受到更新/删除/插入/合并语句的影响。 然后,您可以“比较”其中的两个(或更多)结果,并确定是否有任何表以不同的顺序进行操作(例如,TAB_A 然后是 TAB_B,TAB_B 然后是 TAB_A)。 我怀疑这会引发很多误报。
在 Oracle 中,选择不锁定(SELECT...FOR UPDATE 除外)。因此,死锁仅在数据更新时发生,并且仅在两个并发事务尝试更新相同行时发生。
【讨论】:
事务从第一次插入/更新/删除开始,很容易跟踪。我只是想知道像 Coverity/Klocwork/FindBugs 这样的工具如何成功地在 C++/Java 代码中找到死锁(当然不是所有的,并且有误报,但总比没有好),其中执行路径的数量要大两个订单...... 【参考方案4】:在任何数据库中都存在无穷无尽的死锁可能性。因此,该工具需要使用统计数据来了解哪些死锁每年会在统计上发生一次以上。这样的工具过于复杂,无法证明开发工作的合理性。
最常见的做法是将数据库安装在问答或生产环境中。然后监控实际发生的死锁。您可以针对问答环境运行自动化单元测试来模拟负载。
【讨论】:
我只是想知道像 Coverity/Klocwork/FindBugs 这样的工具如何成功地在 C++/Java 代码中找到死锁(当然不是所有的,并且有误报,但总比没有好),其中执行路径的数量大了两个订单... 没有使用数据,就无法知道数据库上运行了哪些查询。如果您将自己限制在存储过程中,那么没有使用数据就无法知道调用它们的顺序。这与 C++ 或 Java 程序不同,在 C++ 或 Java 程序中,您可以获得更多关于程序如何运行的信息。以上是关于Oracle死锁检测工具的主要内容,如果未能解决你的问题,请参考以下文章
oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法