持有 table 锁的用户 informix

User informix holding onto table lock

我 运行正在 AIX 上使用 Informix v12.10。 我遇到的问题是在以用户 informix 身份登录时发生的。我将 运行 在 SQL 中进行简单查询,例如 "select colour from oceans;"

这显然会在 table 上放置一个打开的游标锁 — 太棒了。现在要确定锁是否真的在 table 上,我使用:

onstat -g opn > filename.txt

正在将输出重定向到一个文件,以便我们对其进行筛选。那么

cat filename.txt | grep -p hexnumber

其中 hexnumber 是 table 的十六进制数。然后我用

得到用户
onstat -u | grep session id

现在,锁由用户 informix 持有,当我关闭会话并等待任意时间并重做处理时,锁仍然存在。

请告知为什么这个锁没有被释放。

正在打开的table不是锁。有了明显的 "self promotion" 警告,我建议您应该使用 "ixtableuse" (https://github.com/domusonline/InformixScripts/blob/master/scripts/ix/ixtableuse)。例如,如果有任何东西阻止 ALTER table,它应该会为您提供信息。

如果您觉得没用,请告诉我原因。如果您觉得有用但发现任何问题,请照做。

当后端 Informix 会话终止时,对 table 的引用将消失。

"close the session" 是什么意思?

如果你只是关闭应用程序而应用程序没有关闭连接那么会话可以激活一段时间

  1. 服务器会话可能仍在处理 sql - 如果是这样,服务器将不会注意到客户端应用程序已经离开,直到 sql 完成并且服务器收到错误它无法将结果发送到客户端应用程序。

  2. 如果服务器会话未处理 sql,服务器将等待来自客户端的命令。直到服务器会话中 TCP/IP keepalive 启动将卡在网络读取调用中并且会话不会消失。

一旦服务器收到客户端已离开的错误,服务器仍将不得不回滚任何活动事务(这可能需要数小时才能完成 GB 的活动事务!)。

一旦事务回滚完成,服务器将 cleanup/free 激活 cursors/prepared sql 语句,之后服务器会话将消失。

您可以在会话线程上使用 onstat -g sesonstat -g stk 来查看发生了什么。