系统故障处理之---TX锁

前几天有反馈说运营平台突然登录不了,紧急查看应用服务器和数据库

在数据库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)


然后开发根据记录找到触发场景,修改代码解决



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值