添加检查约束时无法获得独占访问

Posted

技术标签:

【中文标题】添加检查约束时无法获得独占访问【英文标题】:Unable to obtain exclusive access when adding a check constraint 【发布时间】:2014-01-03 13:07:09 【问题描述】:

我在我的一个 Informix 环境中遇到了一个问题,我无法在表上获得排他锁来添加检查约束。

错误信息

SQL 错误 (-242): 无法打开数据库表 ()。 ISAM 错误:非独占访问。

我的第一个想法是有一个会话使用该表,所以我等到一天结束以尽量减少使用并再次尝试,结果相同。 然后我检查了该表上的锁,但该表上根本没有任何锁,实际上该数据库中现在根本没有锁。 然后我关闭了表上的复制,但问题仍然存在。 现在我对如何解决这个问题一无所知,我宁愿不重新启动服务器或终止与其连接的所有会话。

【问题讨论】:

【参考方案1】:

我刚刚解决了这个问题。 有一些带有脏读的会话在等待从表中读取时卡住了。 由于知道表名,我可以使用

从 systables 中获取十六进制部分
SELECT HEX(partnum) FROM systables where tabname = <table>

然后我使用 onstat -g opn | grep 获取连接到表的线程 ID(结果中称为 tid 的第一列)。 从那里我可以使用 onstat -g ath | grep 获取 rsam 线程控制块地址(结果中的第三列 rtscb,第五列可以查看状态)并与 onstat -u | 一起使用grep 获取会话 ID(结果中的第三列称为 sessid)。 然后我只是使用带有 onmode -z 的会话 ID 来终止活动会话

【讨论】:

【参考方案2】:

很好的答案 - 也值得检查以下内容

onstat -g stm | grep -E "TABLENAME|^session"

这会检查准备好的 SQL 语句缓存,并将返回所有会话和任何提及您的 TABLENAME

session 79412526   ----------------------------------------------------------

session 79412418   ----------------------------------------------------------

session 79412200   ----------------------------------------------------------

c00000042e5eeff0 30624       SELECT COUNT(*) FROM TABLENAME

session 79411988   ----------------------------------------------------------

c0000004167b1230 30624       SELECT COUNT(*) FROM TABLENAME

session 79411978   ----------------------------------------------------------

我当然屏蔽了我们环境中的数据,但你应该明白这一点。

【讨论】:

以上是关于添加检查约束时无法获得独占访问的主要内容,如果未能解决你的问题,请参考以下文章

无法获得对锁定队列的独占访问权限

因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法

因为数据库正在使用,所以无法获得对数据库的独占访问权---还原或删除数据库的解决方法

因为数据库正在使用,所以无法获得对数据库的独占访问权 解决方案

因为数据库正在使用,所以无法获得对数据库的独占访问权

检查 ms 访问中的约束