数据库=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;
完毕