locking - Informix 表已锁定

标签 locking informix

我们的 J2EE Web 应用程序在 Informix 9.40 上运行。

有时一张表被锁定,然后任何具有 SQL 代码访问该表的 JSP 都会返回错误。我知道如何使用 onstat -k 来查看当前的锁,但我想知道是否有任何方法可以跟踪 历史上发生的所有锁以及导致表锁的相关 session 和SQL语句?

因为我不知道下次什么时候会发生同样的错误...

最佳答案

首先,您应该知道 IBM 不再支持 IBM Informix Dynamic Server (IDS) 版本 9.40;后续版本 10.00 也不是。您应该计划升级,可能升级到 11.70,也可能只是升级到 11.50。

没有一种方法可以全面跟踪锁定。原因之一是这种跟踪会给系统带来相当大的减慢——非常显着的减慢。锁通常是共享内存的第二大组成部分(位于包含数据页的缓冲池之后),因此锁的数量很多,而且它们通常非常活跃,并且锁通常被短暂持有(对​​于一小部分)一秒,甚至几分之一毫秒)。此类日志记录生成的数据量将非常大,并且非常难以筛选。

如果您使用的是更高版本,可能会有一些选项可以帮助使用 DB-Cron 和 Admin API(不确定,但机会会更好),但在 9.40 中,选项受到相当严格的限制。

我能想到的最接近的方法是使用 onstat -k -u -r 1 进行快照。 -k 报告锁表(正如您所知); -u 报告用户( session ),-r 1 每秒重复该命令。您可以根据需要添加其他数据请求; -g ses 将提供有关 session 的更详细报告(如果您是 DBSA,通常是用户 informix,在运行该命令时)。但这是 1 秒采样...唯一的好消息是,当将锁放在表上时,它很可能会挂起一段时间(因为您注意到了问题),因此 -g ses-u 输出将告诉您谁或什么应用了锁定。但中间的数据量会很大。

您需要检查系统周围的所有 SQL,寻找表锁定的内容。时间上有一致性吗?例如,它可能是由 cron 作业运行的 UPDATE STATISTICS 吗?我相信,这会很快获得表锁;自您的 IDS 版本以来,它也是在版本中得到改进的。

关于locking - Informix 表已锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265890/

相关文章:

php - 4gl 中 NULL 值和日期的比较

c++ - interprocess::named_upgradable_mutex - 如果进程被杀死则保持锁定

Mysql SELECT FOR UPDATE - 奇怪的问题

c# - 这是在 C# 中引发事件的有效模式吗?

c++ - mutex.lock 与 unique_lock

sql - 如何在 TEXT 数据类型字段中插入数据? (信息系统)

java - 解决Java中链表的手动锁定死锁问题

informix - 将 Informix SQL 查询转换为 ANSI-92 SQL?

database - 在 Informix 上查找长时间运行的查询?

sql-server - 如何让我的 webApp 在不同的 DBMS 之间平滑切换(DB Independency)?