为什么 Firebird 2.5 中所有活动事务的 MON$STATMENTS.MON$SQL_TEXT 中没有 SQL 语句

问题描述 投票:0回答:1

我正在尝试查找我的活动事务的 SQL 语句,特别是 OAT 的 SQL 语句。

我正在运行此查询:

select MT.MON$TRANSACTION_ID,MT.MON$TIMESTAMP,MS.MON$STATEMENT_ID,MS.MON$SQL_TEXT
from MON$TRANSACTIONS MT
left join MON$STATEMENTS MS ON (MS.MON$TRANSACTION_ID=MT.MON$TRANSACTION_ID)
where MT.MON$STATE=1
order by MT.MON$TRANSACTION_ID

我仅针对某些事务获取 MON$SQL_TEXT,而对于 OAT(MON$DATABASE.MON$OLDEST_ACTIVE),MON$STATMENTS 中没有记录

如何获取 OAT 和其他旧活动事务的 MON$SQL_TEXT?

transactions monitoring firebird
1个回答
0
投票

问题是您正在查询值为

MON$STATE_ID
1
。语句仅在主动执行或生成行(以实现从客户端获取)时才处于状态
1

只有在特殊情况下,此执行才会花费很长时间,因此您不太可能看到具有该状态的语句(基本上,只有当您“幸运”时,或者如果您有一个非常非常慢或正在等待的语句在锁定的记录上)。您更有可能看到状态

0
(空闲)或状态
2
(停滞)。 “停滞”状态意味着执行了选择或其他结果集生成语句,并且服务器正在等待客户端从语句句柄的游标中获取行。 “空闲”状态意味着语句句柄存在(有或没有准备好的语句),但当前未执行或等待客户端获取行(没有打开的游标,或已获取所有行)。

对于所有状态,您都可以看到

MON$SQL_TEXT
,尽管在状态 0 中,您可能看不到任何内容,如果 1) 已分配语句,但尚未准备任何内容,或者 2) 语句“未准备” “(即客户端要求服务器忘记在语句句柄上准备的语句)。

处于状态

0
的语句不与事务关联,因此它们具有
MON$TRANSACTION_ID
0
。如果您没有看到活动事务的任何语句,则意味着该事务当前没有活动或停止的语句,这意味着它没有执行任何内容,或者正在执行的任何内容都是通过直接执行启动的,这不使用一个语句句柄(尽管说实话,我不确定它是否可以在表面以下使用语句句柄)。

© www.soinside.com 2019 - 2024. All rights reserved.