可以读取查询导致 Oracle 中的行锁争用



我在一个高交易金融体系工作。我们有一个同时进行大量事务更新的表。优化所有查询,数据模型结构化,灵活支持并发。

我注意到的一件奇特的事情是,在更新期间,如果我们运行在多行上运行SUM(balance)函数的查询,AWR 报告显示 57% 的数据库时间都花在行锁定争用上。

根据我在 Oracle 锁定文档中阅读的内容,任何读取都无法获取行上的锁,并且可以安全地读取提交的数据。如果需要成为函数SUM一部分的行之一已被Select for Update语句锁定,则读取查询是否需要等到释放锁定?

如果没有读取查询,事务将以低至 6% 的争用顺利通过。读取查询是否有可能由于 CPU 不足而占用大量 CPU 资源并导致争用?

我确实注意到,当我们在操作期间运行读取查询时,CPU 的平均使用率从 20% 上升到 80%。

好的,首先,您的"读取查询"是SELECT FOR UPDATE吗? 如果是这样,那么,是的,这将导致锁定。SELECT FOR UPDATE实际上是一个DML,而不仅仅是一个SELECT。 它将执行行级锁定,并可能导致争用。

如果您的SELECT就是这样,而不是SELECT FOR UPDATE,那么它永远不会导致或被行级锁阻止。

一个相关的想法,虽然你没有提到它,如果你在繁重的DML活动下查询表,你可能会看到查询性能下降,相对于不发生繁重DML时的查询性能,这(可能)是由于Oracle的读取一致性机制,以及Oracle可能需要做的额外工作才能获得数据的读取一致性视图。 (将块回滚到给定时间点。

最新更新