----一、数据库死锁的现象
----程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
----二、死锁的原理
----当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
---交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
---此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
---三、 死锁的定位方法
---通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
---1)执行以下语句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
--Username:死锁语句所用的数据库用户;
--Lockwait:死锁的状态,如果有内容表示被死锁。
--Status: 状态,active表示被死锁
--Machine: 死锁语句所在的机器。
--Program: 产生死锁的语句主要来自哪个应用程序。
2)--执行以下语句,可以查看到被死锁的语句。
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
---四、死锁的解决方法
-- 一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可
---能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
--- 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。
-- 1)查找死锁的进程:
--sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
-- 2)kill掉这个死锁的进程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
-- 3)查看此SID是否为killed状态,是则等待数据库touch,第二天再查看。如果还不能解决:
select pro.spid from v$session ses,
v$process pro where ses.sid=XX and
ses.paddr=pro.addr;
-- 其中sid用死锁的sid替换:
---上面的SQL语句查询出这个死锁相关的进程号
---在登陆数据库服务器后台查询这个进程
ps -ef|grep spid
-- 其中spid是这个进程的进程号,kill掉这个Oracle进程。
kill spid
---如果还杀不了的话,再用
kill -9 spid
生产环境存在不可测因素,进行该操作要避开业务高峰进行