Sql Oracle死锁检测工具

Sql Oracle死锁检测工具,sql,oracle,deadlock,code-analysis,static-analysis,Sql,Oracle,Deadlock,Code Analysis,Static Analysis,我正在寻找一个Oracle查询和PL/SQL过程(触发器、约束等)的静态分析器—一个可以传递DB方案并指向潜在死锁的工具。就像Java一样 如果这样的工具不存在,您想拥有它吗?您可以拥有一些静态分析(或至少某种代码质量)工具。不过,我怀疑他们能否找到死锁。从10g开始,数据库现在内置了一个静态PL/SQL分析器: ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL'; 有一个谷歌PLSQL_警告,你会发现一些有用的参考资料 不过我同意Matthew的观

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


如果这样的工具不存在,您想拥有它吗?

您可以拥有一些静态分析(或至少某种代码质量)工具。不过,我怀疑他们能否找到死锁。

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

ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL';
有一个谷歌PLSQL_警告,你会发现一些有用的参考资料


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

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


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

死锁将取决于事务,而不是静态代码。 Oracle中没有“BEGIN TRANSACTION”语句的概念,因此静态分析器无法知道事务的起点是什么。 假设,可以编写一个分析器,这样,如果给它一个起始SQL或PL/SQL语句,它就可以跟踪所有潜在的执行路径,并确定哪些表按照什么顺序执行update/delete/insert/merge语句。 然后,您可以“比较”两个(或更多)结果,并确定是否存在以不同顺序操作表的情况(例如,一个是TAB_a然后TAB_B,另一个是TAB_B然后TAB_a)。 我怀疑这会带来很多误报


在Oracle中,选择“不锁定”(选择“更新…”除外)。因此,死锁仅在数据更新时发生,并且仅在两个并发事务试图更新相同的行时发生

事务在第一次插入/更新/删除时开始,易于跟踪。我只是想知道像Coverity/Klocwork/FindBugs这样的工具是如何成功地在C++/Java代码中发现死锁的(当然不是所有的,而且有误报,但比没有要好得多),因为执行路径的数量要大两个数量级……我只是想知道像Coverity/Klocwork/FindBugs这样的工具是如何成功地找到死锁的(当然不是全部,也有误报,但总比没有好得多)在C++/java代码中,执行路径的数量是两个数量级的大……没有使用数据,就无法知道数据库上运行哪些查询。如果限制了存储过程,就不知道没有使用数据的调用顺序。这与C++或java程序不同,在这里C++有很多。有关程序将如何运行的详细信息。