是否有可能DB2控制中心的操作阻止了java代码中的查询?

时间:2014-05-05 07:54:25

标签: java sql database db2

我在一些java代码中执行sql查询,但是在调用ResultSet.next()时执行被阻止。与此同时,我发现我正在使用IBM DB2 Control Center访问查询表。当我关闭Control Center时,将恢复对ResultSet.next()的调用。所以我怀疑我在Control Center上的操作锁定了查询表。这可能吗?我如何确认这一点(即如何知道某个表是否在DB2中被锁定)?

2 个答案:

答案 0 :(得分:2)

是的,可以根据查询阻止它。它是控制中心并不重要,它可以是任何其他类型的连接。事实上,在一个连接中,你锁定一个表或一行,另一个连接尝试访问该表或行,但第二个连接保持在锁定等待'因为它应该等待第一次连接的锁定释放。

假设您从控制中心创建了一个表,但您没有执行提交。从Java应用程序发出select时,表中会有一个锁等待。您应该在控制中心发出回滚或提交以释放锁定。

为了看到锁,有很多工具,但是db2top,在分析实时情况时,选项u对我来说是个不错的选择。

最后,为什么要使用控制中心?它已经过时了。试试IBM Data Studio。

答案 1 :(得分:1)

虽然AngocA总的来说是正确的,但必须说你所经历的可能会暗示一些配置问题,因为在正常情况下,两个只读事务不应该相互锁定。

DB2 normaly使用行锁定。但是,如果锁定行的数量对于所谓的锁定列表而言太大,则db2服务器可能会执行所谓的“锁定升级”,并使用表上的单个独占锁替换某些表的数百万行锁。

这种行为还取决于所谓的隔离模式,但这是SO帖子中不易解释的主题;你需要阅读一些文档才能理解它。

可以使用db参数LOCKLIST配置锁定列表的大小。诊断日志(查找文件db2diag.log)会告诉您是否已发生锁定升级。