为什么在'KILL SESSION'(Oracle SQL)中需要sid?

Jur*_*ury 5 sql oracle sessionid

我有考试题,找不到答案.为什么sid强制要求执行KILL SESSION命令?
KILL SESSION语法:ALTER SYSTEM KILL SESSION 'sid,session#[@inst_id]' [IMMEDIATE];
其中sid是"唯一"会话标识符.引号中的唯一因为它在当前时刻是唯一的,例如,Oracle服务器可以具有会话一些sid,但是在此会话结束之后,此sid可以用于其他会话.在操作系统中Sid是类比pid的.
Session#是一个串行会话号; 这是一个会议柜台.服务器在数据库启动时清除计数器.因此,session#是会话的真正唯一标识符.

我不明白为什么sid强制KILL SESSION命令.我想,有可能session#只使用.

谢谢.

Gle*_*enn 6

您需要 SID 和 SERIAL#。oracle参考有这样的说法:

SID 会话标识符

SERIAL# 会话序列号。用于唯一标识会话的对象。如果会话结束并且另一个会话以相同的会话 ID 开始,则保证会话级命令应用于正确的会话对象

因此,虽然 SID 是唯一的,但它可以重复使用。所以我想添加一个 SERIAL# 将确保您不会杀死一个新连接的会话,该会话恰好使用您试图杀死的相同 SID(如果它们在您执行命令之前已经断开连接)。

更新以回应陪审团的评论:

我不能说为什么它是这样实现的,只是我根据文档对实现的理解:SID 是可重用的,SID 中的 SERIAL# 不是。所以,作为一个例子:

  • [1,1] JOE 连接并被分配 SID 1, SERIAL# 1
  • JOE 断开连接
  • [1,2] TOM 连接并被分配 SID 1(重用),但 SERIAL# 增加到 2
  • [2,1] SUSAN 连接并被分配 SID 2, SERIAL# 1

为什么要这样实现?保持数字大小可管理,也许?减少争用?重用已分配的资源(由 SID 表示)?我不知道。


Jur*_*ury 6

我找到了!序列serial#是循环的。如果int使用了20 亿次登录后,或者short使用了32k后,数字将被重用。因此,serial#不使用任何其他东西并不能提供真正独特的枚举。
sid在某一刻是独一无二的。所以,对sid,serial#真正独一无二的
您不能使用serial#sid管理会话,您应该成对使用它。

感谢您的时间!