死锁解析
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;