为什么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) 语句“未准备” “(即客户端要求服务器忘记在语句句柄上准备的语句)。

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