首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle中查找锁定的行

如何在Oracle中查找锁定的行
EN

Stack Overflow用户
提问于 2010-02-03 03:09:40
回答 6查看 106K关注 0票数 17

我们有一个Oracle数据库,customer account表大约有一百万行。多年来,我们已经构建了四个不同的UI(两个在Oracle Forms中,两个在.Net中),所有这些都在使用中。我们也有许多后台任务(包括持久的和计划的)。

某些东西偶尔会在account表中的某一行上持有较长的锁(比如,超过30秒),这会导致某个持久性后台任务失败。一旦更新超时,有问题的后台任务就会重新启动。我们在它发生几分钟后发现了它,但那时锁已经被释放了。

我们有理由相信这可能是一个行为不端的用户界面,但还没有找到“确凿的证据”。

我发现了一些列出块的查询,但这是在您有两个作业争用一行时使用的。我想知道在没有第二个作业尝试获取锁的情况下,哪些行有锁。

我们是在11g上,但从8i开始就遇到了这个问题。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-03 04:49:56

Oracle的锁定概念与其他系统有很大不同。

Oracle中的一行被锁定时,记录本身将被更新为新值(如果有的话),此外,锁(本质上是指向驻留在回滚段中的事务锁的指针)被直接放入记录中。

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

更重要的是,记录本身在提交后不会更新:而是更新回滚段。

这意味着,即使事务本身早已死亡,每个记录也会保存有关上次更新它的事务的一些信息。要查明事务是否处于活动状态(以及记录是否处于活动状态),需要访问回滚段。

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

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

票数 13
EN

Stack Overflow用户

发布于 2015-04-03 10:37:50

您可以通过以下查询在oralce中查找被锁定的表

代码语言:javascript
复制
    select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;
票数 6
EN

Stack Overflow用户

发布于 2010-02-03 05:44:56

我建议您使用v$transaction查看长时间运行的事务,而不是锁。在那里,您可以连接到v$session,这应该会让您对UI (尝试程序和机器列)以及用户有一个了解。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2186848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档