我有 Oracle 9.2
我使用查询查看我的运行会话:
SELECT S92700.SYSUSR_VW."NAME", SID,SERIAL#, AUDSID
FROM v$session, S92700.SYSUSR_VW, S92700.SECUSR
WHERE S92700.SYSUSR_VW.SESSIONID = AUDSID AND S92700.SECUSR."NAME"=S92700.SYSUSR_VW."NAME"
Run Code Online (Sandbox Code Playgroud)
结果:
NAME SID SERIAL# AUDSID
prot6 9 6503 78239
Run Code Online (Sandbox Code Playgroud)
我运行以下查询来终止会话
alter system kill session '9,6503' immediate
Run Code Online (Sandbox Code Playgroud)
在 0 秒内成功执行,0 行受影响。第 1 行,第 1 列
0 秒后执行完成,发生 0 个错误。
会话仍在运行
其他模式中的相同查询正在工作
会话已终止,但正在清理。当你终止一个会话时——仍然必须清理未完成的工作。
当您对表执行 DML 时,即使您没有提交,Oracle 也可能几乎立即对基表进行更改。由于多版本读取一致性,其他会话尚未看到这些更改,但实际物理块可能已经被您未提交的工作覆盖。
这样做是因为 Oracle 针对提交进行了优化。大多数会话应该很少回滚,因此 Oracle 通过抢先写入更改来预测。这也是允许 Oracle 拥有任意大事务(仅受undo 表空间大小限制)的原因之一。更改不会延迟(很多)。这也是为什么您几乎从不等待 Oracle 中的提交,即使是数百万行的 DML。
后果之一是回滚需要撤消更改。未提交的事务从撤消表空间读回,并且每个更改都以相反的顺序撤消。由于以下几个原因,这可能需要比初始 DML 更长的时间:
这解释了为什么回滚可能需要很多时间。你几乎没有办法加速这个过程。在任何情况下,您都不应该:
如果您正常(或事务性或立即性)关闭数据库,Oracle 将等待该过程完成以使数据库保持一致状态。如果关闭ABORT
,数据库将处于不一致状态(未提交的数据写入磁盘),一旦数据库重新启动,Oracle 将恢复回滚。
回滚由smon处理,我不会试图杀死它。
某些会话在被杀死后仍将保留在v$session
视图中,即使它们的所有更改都已完全回滚。这通常是因为 Oracle 正在等待客户端返回相关错误消息,例如:
ora-00028 your session has been killed
Run Code Online (Sandbox Code Playgroud)
如果客户端本身已经离开或网络通信已被切断,则被终止的会话可能会无限期保留,直到您重新启动实例。我认为这些会议不会占用资源。
归档时间: |
|
查看次数: |
43515 次 |
最近记录: |