我的死锁经历

数据库=oracle

测试人员在对程序进行黑盒测试时频繁出现timeout;

本地复现,发现日志打印到一条删除语句时一直没有得到结果;

拿到sql的条件,直接操作数据库;

根据条件查询,正常查到结果;

根据条件delete,则无休止的等待下去;

怀疑被锁;

删除同一张表的其他数据,可以正常删除;

怀疑该记录被锁;

查询表中的锁:

查看那个表被死锁了

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

找到详细信息

select *
  from v$session t1, v$locked_object t2
 where t1.sid = t2.SESSION_ID;

发现该表有四条锁记录;

解决办法:删除锁记录

alter system kill session 'sid  ,serial#';

alter system kill session'154,1030';

删一个,少一条记录,当删除第三条时,四条记录全消失了;

确定,出现的死锁;

至此,程序正常;

死锁排查,待续...

死锁程序回避:

请求进入程序没执行有风险的操作前,去redis查询key;

有记录,程序等待5ms,继续操作;

没有记录,放入redis一个key;

程序执行完毕,删除key;

完毕

原文地址:https://www.cnblogs.com/chenglc/p/9813593.html