死锁解析

1.加锁顺序一致,尽可能一次性锁定所需的数据行

2.尽量基于primary(主键)或unique key更新数据

3.单次操作数据量不宜过多,涉及表尽量少

4.将容易行锁冲突的sql语句防止事务靠后边执行。如果而且能够排序尽量排序,避免造成交叉出现死锁。

行锁,只是阻塞,如果等待的事务commit完成后会继续执行。

死锁,如上图,出现交叉等待就会不能再执行。

oracle查看阻塞,可能是行锁阻塞,也可能是死锁。

select d.sid,d.serial#,d.SQL_ID,d.STATUS,d.EVENT,d.MACHINE,d.PORT,d.TYPE,d.OSUSER, d.username,c.* from 
(select b.OWNER, b.object_name,a.session_id,a.locked_mode  from v$locked_object a left join dba_objects b on b.object_id = a.object_id) c
left join 
v$session d on c.session_id=d.SID order by d.LOGON_TIME;

杀掉上述锁

--关闭session, '126,63131'值为'SID,SERIAL'
alter system kill session '126,63131';

查看哪个sid正在阻塞着另一个sid

SELECT 
    l1.sid || ' IS BLOCKING ' || l2.sid blocked_sessions
FROM 
    v$lock l1,
    v$lock l2
WHERE
    l1.block = 1 AND
    l2.request > 0 AND
    l1.id1 = l2.id1 AND
    l1.id2 = l2.id2;

 

posted @ 2024-07-03 10:12  新手娃娃菜  阅读(1)  评论(0编辑  收藏  举报