加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在Oracle中查找锁定的行

发布时间:2020-12-12 15:12:35 所属栏目:百科 来源:网络整理
导读:我们有一个Oracle数据库,客户帐户表有大约一百万行.多年来,我们已经建立了四个不同的用户界面(两个在Oracle Forms中,两个在.Net中),所有这些UI都在使用中.我们还有许多后台任务(包括持续的和计划的). 偶尔会在帐户表中的一行持有长锁(比如说超过30秒),这会导
我们有一个Oracle数据库,客户帐户表有大约一百万行.多年来,我们已经建立了四个不同的用户界面(两个在Oracle Forms中,两个在.Net中),所有这些UI都在使用中.我们还有许多后台任务(包括持续的和计划的).

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

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

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

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

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

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读