问题一:当我UPDATE某一条记录时总是被锁住,我怎样才能找到原因并排除?
处 理 用 户 被 锁 住 的 方 法
当 一 个 用 户 抱 怨 他 被 锁 住 了, DBA 首 先 要 做 的 是 向 用 户 了 解 他 在 锁 定 的
点 执 行 的 操 作, 并 确 定 用 户 是 否 真 的 被 锁 住 了。 下 列 查 询 会 返 回 当 前 被
锁 住 的 用 户 列 表:
select a.username, a.sid, a.serial#, b.id1, c.sql_text
from v$session a, v$lock b, v$sqltext c
where a.lockwait = b.kaddr
and a.sql_address = c.address
and a.sql_hash_value = c.hash_value;
USERNAME SID SERIAL# ID1 SQL_TEXT
SCOTT 11 9 131080 update
plsql_user.s_employee
set salary = 5000
结 果 显 示 SCOTT 是 在 做 UPDATE 时 被 锁 住 了。 下 一 步 是 确 定 谁 锁 住 了 该 用
户, 而 这 个 用 户 又 在 做 何 操 作。 你 可 以 执 行 下 列 查 询:
select a.username, a.sid, a.serial#, b.id1, c.sql_text
from v$session a, v$lock b, v$sqltext c
where b.id1 in
(select distinct e.id1
from v$session d, v$lock e
where d.lockwait = e.kaddr)
and a.sid = b.sid
and c.hash_value = a.sql_hash_value
and b.request = 0;
USERNAME SID SERIAL# ID1 SQL_TEXT
PLSQL_USER 10 26 131080 update s_employee
set salary = 10000
结 果 显 示 是 由 于 PLSQL_USER 和 SCOTT 对 同 一 TABLE 做 UPDATE 而 锁 住 了 SCOTT。
当 你 有 了 这 些 信 息, 就 可 以 通 过 KILL SESSION, 释 放 锁。 例 如 我 们 可 以
用 下 面 的 命 令 来 杀 死 PLSQL_USER 的 SESSION。
alter system kill session '10,26';
Oracle DBA常用操作
最新推荐文章于 2024-09-23 17:06:41 发布