我正在寻找一个Oracle查询和PL / SQL程序(触发器,约束......)的静态分析器 - 一种将传递我们的数据库方案并指向潜在死锁的工具。就像Java的FindBugs一样。
如果这样的工具不存在,你想拥有它吗?
答案 0 :(得分:2)
从10g开始,数据库现在内置了一个静态PL / SQL分析器:
ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL';
有一个google for PLSQL_WARNINGS,你会找到一些有用的参考资料
我同意Matthew的观点,你不太可能找到能够特别有效地检测死锁的分析器......有太多的变量在起作用。
答案 1 :(得分:1)
TOAD有一些静态分析(或至少某种代码质量)工具。我怀疑他们能找到死锁。
答案 2 :(得分:1)
死锁将取决于不在静态代码上的事务。 Oracle中没有“BEGIN TRANSACTION”语句的概念,因此静态分析器无法知道事务的起点是什么。 假设,可以编写分析器,使得如果给它一个起始SQL或PL / SQL语句,它可以跟踪所有潜在的执行路径并确定哪些表以什么顺序进行更新/删除/插入/合并语句。 然后你可以“比较”它的两个(或更多)结果,并确定是否有任何表以不同的顺序操作(例如TAB_A然后TAB_B在一个和TAB_B然后TAB_A在另一个中)。 我怀疑这会引发很多误报。
在Oracle中,选择不锁定(SELECT ... FOR UPDATE除外)。因此,死锁仅发生在数据更新上,并且仅在两个并发事务尝试更新相同行时发生。
答案 3 :(得分:-2)
任何数据库都存在无限的死锁可能性。因此,该工具需要使用统计信息来了解哪些死锁每年会在统计上发生多次。这样的工具太复杂,无法证明开发工作的合理性。
最常见的做法是在Q& A或生产环境中安装数据库。然后监视实际发生的死锁。您可以针对Q& A环境运行自动化单元测试来模拟负载。