代码之家  ›  专栏  ›  技术社区  ›  idiotgenius

Informix表已锁定

  •  1
  • idiotgenius  · 技术社区  · 14 年前

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

    有时一个表被锁定,然后任何具有访问该表的SQL代码的JSP都将返回一个错误。我知道怎么用 onstat -k 看看现在的锁,但我想知道有没有办法追踪 所有的锁都发生在历史记录以及导致表锁的相关会话和SQL语句中?

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

    1 回复  |  直到 14 年前
        1
  •  3
  •   Jonathan Leffler    14 年前

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

    没有一种全面跟踪锁的方法。其中一个原因是,这样的跟踪会对系统造成相当大的减速——非常大的减速。锁通常是共享内存的第二大组成部分(在包含数据页的缓冲池之后),因此有很多锁,而且它们通常非常活跃,并且锁通常被快速地保持(对于很小的一秒钟,甚至是毫秒的一小部分)。这种记录产生的数据量将非常大,而且很难筛选。

    如果您使用的是更高版本,那么可能有一些选项可以帮助使用DB Cron和Admin API(这一点还不确定,但可能性会更好),但是对于9.40,这些选项是非常严格限制的。

    我能想到的最接近的方法是 onstat -k -u -r 1 . 这个 -k 关于锁表的报告(如您所知) -u 关于用户(会话)的报告,以及 -r 1 每秒重复此命令。您可以根据需要添加其他数据请求; -g ses 会提供更详细的会话报告(如果您是DBSA,通常是用户 informix ,运行命令时)。但这是一秒钟的取样…唯一的好消息是当锁放在桌子上时,它可能会在桌上停留一段时间(因为你注意到了问题),所以 -塞斯 -u型 输出将告诉您谁或什么应用了锁。但中期的数据量会很大。

    您需要检查系统周围的所有SQL,查找表锁定的内容。时间安排有一致性吗?例如,它可能是由cron作业运行的更新统计信息吗?我相信,这会快速获取表锁;这也是自您的IDS版本以来在发行版中得到改进的东西。