可以利用 SQL 脚本检查实例中当前锁定情况. 在数据库中第一次执行任何与锁定有关的 SQL 脚本之前, 都需要首先运行 catblock.sql 脚本, 该脚本位于 $Oracle_HOME/rdbms/admin 目录下. 运行此脚本将创建几个与锁定有关的重要视图, 如 DBA_LOCKS,DBA_WAITERS,DBA_BLOCKERS 等.
Oracle 提供一个名为 utllockt.sql 的脚本, 它会给出一个树形结构的锁等待图, 显示持有影响其他会话的锁的会话. 使用此脚本, 可以看出一个会话正在等待什么锁, 哪个会话持有这些锁. 该脚本位于 $ORACLE_HOME/rdbms/admin 目录下. 下面是执行 utllockt.sql 脚本的一个示例:
- SQL> @$ORACLE_HOME/rdbmsa/admin/utllockt.sql
- Waiting session Type Mode requested Mode Held Lock Id1
- --------------- ---- -------------- ------------- ---------
- 682 None None None 0
- 363 TX Share (S) Exclusive (X)
utllockt.sql 脚本显示系统中等待锁的会话以及他们等待的锁, 输出为树形结构. 如果一个会话的 ID 紧跟在另一个会话的下方, 则表示他正在等待该会话. 页面最左边显示的会话 ID 是所有会话都在等待的会话.
在上面的示例中, 最左边的会话 ID (682)为会话 363 正在等待的会话, 每个会话右边显示的信息给出它所等待的锁信息. 虽然会话 682 持有一个锁, 但在锁信息列中并未显示任何信息 (None), 因为它不等待任何锁. 而会话 363 显示它请求一个共享(S) 锁, 并且正等待会话 682 释放表行上的独占 (X) 锁.
来源: http://www.linuxidc.com/Linux/2019-09/160606.htm