我正在通过ODBC从Informix数据库的sysmaster表中读取已安装的数据库。我的问题是,当DBA正在执行数据库导入时,该表将被锁定,直到完成为止,这可能需要数小时。我希望在我的代码中处理这种情况,而不是在完成此操作时尝试连接到该数据库。
有没有办法读出表的状态,无论它是否通过SQL查询锁定?
修改 我在我的代码中捕获ODBC异常(-2146232009)以处理锁定的表,但我真的不喜欢处理此异常的想法。
答案 0 :(得分:2)
sysmaster:syslocks表应包含您需要的信息。它实际上是一个视图,但如果它是一个表,则该语句可能如下所示:
CREATE TABLE "informix".syslocks
(
dbsname CHAR(128),
tabname CHAR(128),
rowidlk INTEGER,
keynum SMALLINT,
type VARCHAR(4),
owner INTEGER,
waiter INTEGER
);
在一个非常闲置的系统中,我在sysmaster数据库中查找,我跑了:
SELECT * FROM SysLocks;
得到了输出:
sysmaster sysdatabases 516 0 S 31
sysmaster sysdatabases 516 0 S 32
sysmaster sysdatabases 516 0 S 33
sysmaster sysdatabases 513 0 S 37
这应该为您提供所需的信息。您可能需要进行一些实验以确保正确完成(确切地找出DB-Import在其正在处理的数据库上设置或设置了哪些锁)。
还有另一个视图,即SysLockTab视图,它包含更详细,更少用户的信息。并且可以使用任何可以访问的基础表来构建这些视图。这些应该会为您提供SysLocks视图中缺少的任何信息。