产生死锁有两种场景
- 阻塞
第一个连接占有资源有释放,而第二个连接需要获取这个资源.如果第一个连接没有提交 第二个连接会一直等待下去,直到第一个连接释放该资源 为上.对于阻塞,数据库无法处理 - 死锁
第一个连接有释放,准备获取 第二个连接所资源 ,而第二个连接资源没有释放,准备获取第一个连接所占用的资源 .这种互相方需要获取的资源 的现象叫做死锁
注意: 对于这种死锁数据库会处理 杀掉一个 让另一个能执行
java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource
关于阻塞时 要执行的参考SQL
--产生阻塞的表
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;
--产生阻塞的sessionId
select b.username,
b.sid,
b.serial#,
b.LOCKWAIT,
b.STATUS, -- ACTIVE表示该条语句出现阻塞等待中了无法执行直到别人提交才能执行
b.PROGRAM,
b.MACHINE,
logon_time
from v$locked_object a, v$session b
where a.session_id = b.sid
order by b.logon_time;
--产生阻塞的SQL语句
select sql_text
from v$sql
where hash_value in
(select sql_hash_value
from v$session
where sid in (select session_id from v$locked_object))
--杀掉死锁
alter system kill SESSION '405,47249';
pl/sql工具查询锁
工具–>会话–>锁