ALTER SYSTEM DISCONNECT SESSION IMMEDIATE 比 KILL SESSION 更彻底,能立即回滚事务、释放锁、断开连接,且不依赖 PMON 清理;对专用/共享服务器均有效,执行后会话记录快速消失。

直接执行 ALTER SYSTEM KILL SESSION 不一定能立刻释放资源,会话状态可能长期卡在 KILLED,锁仍不释放——这不是命令没生效,而是 Oracle 的清理机制依赖 PMON 进程异步回收。
查会话必须用 v$session,别漏掉 serial# 里的井号
常见错误是写成 serial(少 #),结果查不到任何记录:
-
select sid, serial# from v$session where username = 'SCOTT';—— 注意是serial#,不是serial - 返回多行时,每行都要单独 kill,不能拼成一个字符串批量执行
- 如果用户有共享服务器(MTS)连接,
v$session中的server列值为SHARED,此时KILL SESSION效果有限,优先考虑DISCONNECT SESSION
ALTER SYSTEM DISCONNECT SESSION ... IMMEDIATE 比 KILL SESSION 更彻底
KILL SESSION 只是标记终止,而 DISCONNECT SESSION 真实切断连接,等价于杀 OS 进程:
-
ALTER SYSTEM DISCONNECT SESSION '123,4567' IMMEDIATE;—— 立即回滚事务、释放锁、断开连接 -
ALTER SYSTEM DISCONNECT SESSION '123,4567' POST_TRANSACTION;—— 等当前事务结束再断开,适合关键业务场景 - 该语句对专用服务器(DEDICATED)和共享服务器都有效,且不依赖 PMON 清理时机
- 执行后,
v$session中对应记录很快消失,不像KILL SESSION那样残留KILLED状态几分钟
真要“立刻”释放锁?得配合操作系统级操作
遇到大事务或长时间未响应的会话,单靠 SQL 命令可能卡住。这时需要定位并干掉底层 OS 进程:
- 先查 SPID:
SELECT p.spid FROM v$process p, v$session s WHERE p.addr = s.paddr AND s.sid = 123; - Linux 下执行:
kill -9 <spid></spid>;Windows 下用:orakill ORACLE_SID <spid></spid> - 注意:必须确认 SPID 对应的是目标用户,误杀
PMON、SMON等后台进程会导致实例崩溃 - 建议顺序:先
DISCONNECT SESSION ... IMMEDIATE,再查v$session状态,若仍为ACTIVE或锁未释放,再走 OS 层面
最易被忽略的一点:DISCONNECT SESSION 和 KILL SESSION 都要求你有 ALTER SYSTEM 权限,且目标用户不能是当前会话自己——想杀自己?只能从客户端断开或让别人来操作。


















