Oracle表的死锁

来源:互联网 发布:淘宝官方客服几点上班 编辑:程序博客网 时间:2024/05/21 12:47
案例:用PL/SQL Developer修改数据库中table1表的记录后未提交,然后在程序中 通过Hibernate操作数据库中table1,发现系统会停在操作数据库的那一句,无报错,长时间无响应。这时侯这张表就 死锁 了。


一、         数据库死锁的现象
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、         死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、         死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。

解决死锁方法:
--查询出来的结果为  解锁语句
select 'alter system kill session '''   ||s.sid||','||s.serial#||'''; '
  from v$locked_object l,dba_objects o ,v$session s
  where l.object_id = o.object_id and l.session_id=s.sid;


--查询 引起死锁的SQL语句
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))


--
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)


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;