文章目录
一、注意点
不一定产生的所有锁都是死锁,如:A、B两个表有主外键关联,那么在对从表的数据进行操作时,是不允许删除主表的数据的,所以锁住了主表的数据(有关联的)。
二、死锁的查询及处理
-- 在数据库无系统运行时(直接查锁)
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID
-- 杀掉对应的会话进程(SID,SERIAL#)
alter system kill session '19,5884';
-- 存在系统运行(有其他锁)object_name:表名
SELECT
s.SID,
s.serial#,
lo.oracle_username,
lo.os_user_name,
do.object_name,
lo.locked_mode
FROM
v$locked_object lo,
dba_objects do,
v$session s
WHERE
do.object_id = lo.object_id
AND lo.session_id = s.SID;
-- 查看是什么语句造成的死锁
select l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
s.user#,
l.os_user_name,
s.machine,
s.terminal,
a.sql_text,
a.action
from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
and s.prev_sql_addr = a.address
order by sid, s.serial#;
-- 如果造成锁表的语句和某张表密切相关,则可能是该表的索引产生异常
-- 查表的索引
SELECT * FROM user_indexes where table_name='表名'
-- 查表的索引的基本情况
select user_ind_columns.index_name,user_ind_columns.column_name,
user_ind_columns.column_position,user_indexes.uniqueness
from user_ind_columns,user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = '表名';