0

我正在寻找一个 Oracle 查询和 PL/SQL 过程(触发器、约束等)的静态分析器 - 一个将传递我们的数据库方案并指向潜在死锁的工具。就像Java 的FindBugs一样。

如果这样的工具不存在,你想要吗?

4

4 回答 4

2

从 10g 开始,数据库现在内置了一个静态 PL/SQL 分析器:

ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL';

有一个 PLSQL_WARNINGS 的谷歌,你会发现一些有用的参考资料

不过,我同意 Matthew 的观点,您不太可能找到一种能够特别有效地检测死锁的分析器……有太多变量在起作用。

于 2009-05-13T11:31:48.957 回答
1

死锁将取决于事务而不是静态代码。Oracle 中没有“BEGIN TRANSACTION”语句的概念,因此静态分析器无法知道事务的起点是什么。假设,可以编写一个分析器,如果给定一个起始 SQL 或 PL/SQL 语句,它可以跟踪所有潜在的执行路径并确定哪些表以什么顺序受到更新/删除/插入/合并语句的影响。然后,您可以“比较”其中的两个(或更多)结果,并确定是否有任何表以不同的顺序进行操作(例如,TAB_A 然后 TAB_B 一个,TAB_B 然后 TAB_A 另一个)。我怀疑这会引发很多误报。

在 Oracle 中,选择不锁定(SELECT...FOR UPDATE 除外)。因此,死锁仅在数据更新时发生,并且仅在两个并发事务尝试更新相同行时发生。

于 2009-05-13T23:11:59.610 回答
1

TOAD 有一些静态分析(或至少某种代码质量)工具。我怀疑他们是否能够找到死锁。

于 2009-05-13T09:28:49.627 回答
-2

任何数据库中都有无穷无尽的死锁可能性。因此,该工具需要使用统计数据来了解哪些死锁在统计上每年会发生一次以上。这样的工具过于复杂,无法证明开发工作的合理性。

最常见的做法是将数据库安装在问答或生产环境中。然后监控实际发生的死锁。您可以针对问答环境运行自动化单元测试来模拟负载。

于 2009-05-13T11:34:42.510 回答