如何在Oracle中查找锁定的行

前端之家收集整理的这篇文章主要介绍了如何在Oracle中查找锁定的行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个Oracle数据库,客户帐户表有大约一百万行.多年来,我们已经建立了四个不同的用户界面(两个在Oracle Forms中,两个在.Net中),所有这些UI都在使用中.我们还有许多后台任务(包括持续的和计划的).

偶尔会在帐户表中的一行持有长锁(比如说超过30秒),这会导致一个持久的后台任务失败.一旦更新超时,后台任务就会重新启动.发生之后几分钟就会发现,但是锁已经被释放了.

我们有理由相信这可能是一个行为不端的用户界面,但却无法找到“吸烟枪”.

我发现一些列表块的查询,但是当您有两个工作争夺一行时.当没有必要的第二个工作试图获得锁时,我想知道哪些行有锁.

我们在11g,但自8i以来一直遇到这个问题.

Oracle的锁定概念与其他系统的锁定概念截然不同.

当Oracle中的一行被锁定时,记录本身将以新值(如果有的话)进行更新,另外还有一个锁(本质上是一个驻留在回滚段中的事务锁的指针)被放置在记录中.

这意味着在Oracle中锁定记录意味着更新记录的元数据并发出逻辑页面写入.例如,您不能在只读表空间上执行SELECT FOR UPDATE.

更重要的是,记录本身不会在提交后更新:相反,回滚段被更新.

这意味着每个记录保存有关最后更新它的交易的一些信息,即使交易本身早已死亡.要查明事务是否存活(因此,如果记录是否存在),则需要访问回滚段.

Oracle没有传统的锁管理器,这意味着获取所有锁的列表需要扫描所有对象中的所有记录.这需要太长时间.

您可以获得一些特殊的锁,例如锁定的元数据对象(使用v $locked_object),锁定等待(使用v $session)等,但不能获取数据库中所有对象的所有锁的列表.

原文链接:https://www.f2er.com/oracle/204902.html

猜你在找的Oracle相关文章