前几天有反馈说运营平台突然登录不了,紧急查看应用服务器和数据库
在数据库EM 控制台发现数据库有死锁,如图:
发现是两个应用程序进程执行了相同的UPDATE语句,产生死锁
查出死锁的用户和进程:
select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
因高峰期,情况紧急,先杀掉死锁,让系统恢复正常:
ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
原因分析:
产生TX锁的原因是应用程序业务逻辑出现问题,很可能是多线程机制导致多个会话同时UPDATE同一条记录,想彻底解决只能修改应用程序
跟架构沟通后,他反馈一时定位不到代码哪里有问题,问我能否查到这些会话共同锁住的是哪条记录:
等第二次发生死锁时,通过以下语句找出具体锁住的那条记录
--1 find out the exact file#, block# and Record# where it is waiting
select inst_id c0,sid,program c1,ROW_WAIT_OBJ# object_no, ROW_WAIT_FILE# Rfile_no,
ROW_WAIT_BLOCK# Block_no ,ROW_WAIT_ROW# Row_no
from gv$session
where (inst_id,sid) in (select inst_id,sid from gv$session_wait where p1='1415053318')
--2 Let’s find the row value details
--根据1查询出的结果 81520 4 191 0
select * from ETS.ETS_ORDER where rowid like
DBMS_ROWID.ROWID_CREATE(1,&Object_No,&Rfile_No, &Block_No, &Row_Number)
然后开发根据记录找到触发场景,修改代码解决