在Oracle数据库中,要查看哪些表被锁了,你可以使用以下几种方法:
1. 使用 `v$locked_object` 视图
`v$locked_object` 视图提供了有关被锁对象的详细信息。
```sql
SELECT
o.owner,
o.object_name,
o.object_type,
l.session_id,
l.locked_mode,
s.username
FROM
v$locked_object l,
dba_objects o,
v$session s
WHERE
l.object_id = o.object_id
AND l.session_id = s.sid;
```
这个查询会返回被锁的表的所有者、表名、对象类型、会话ID、锁定模式和用户名。
2. 使用 `v$lock` 和 `v$session` 视图
如果你需要更详细的锁信息,可以使用 `v$lock` 和 `v$session` 视图结合使用。
```sql
SELECT
s.sid,
s.serial,
s.username,
s.program,
o.object_name,
l.lmode,
l.request,
l.type
FROM
v$lock l,
v$session s,
dba_objects o
WHERE
s.sid = l.sid
AND o.object_id = l.id1
AND l.lmode != 0
ORDER BY
s.sid,
l.lmode;
```
这个查询返回锁的模式、请求、类型等信息。
3. 使用 `lock_name` 字段
在某些情况下,你可能只对特定的锁类型感兴趣。例如,使用 `lock_name` 字段来筛选特定类型的锁。
```sql
SELECT
s.sid,
s.serial,
s.username,
s.program,
o.object_name,
l.lmode,
l.request,
l.type,
l.lock_name
FROM
v$lock l,
v$session s,
dba_objects o
WHERE
s.sid = l.sid
AND o.object_id = l.id1
AND l.lock_name = 'TM' -示例:事务锁
ORDER BY
s.sid,
l.lmode;
```
在这个例子中,我们筛选出事务锁。
注意事项
这些查询需要具有足够的权限才能访问视图和对象信息。
根据Oracle版本的不同,视图的名称和结构可能会有所不同。
使用这些查询可以帮助你诊断和解决数据库中的锁定问题。