我在一些java代码中执行sql查询,但是在调用ResultSet.next()时执行被阻止。与此同时,我发现我正在使用IBM DB2 Control Center访问查询表。当我关闭Control Center时,将恢复对ResultSet.next()的调用。所以我怀疑我在Control Center上的操作锁定了查询表。这可能吗?我如何确认这一点(即如何知道某个表是否在DB2中被锁定)?
答案 0 :(得分:2)
是的,可以根据查询阻止它。它是控制中心并不重要,它可以是任何其他类型的连接。事实上,在一个连接中,你锁定一个表或一行,另一个连接尝试访问该表或行,但第二个连接保持在锁定等待'因为它应该等待第一次连接的锁定释放。
假设您从控制中心创建了一个表,但您没有执行提交。从Java应用程序发出select时,表中会有一个锁等待。您应该在控制中心发出回滚或提交以释放锁定。
为了看到锁,有很多工具,但是db2top,在分析实时情况时,选项u对我来说是个不错的选择。
最后,为什么要使用控制中心?它已经过时了。试试IBM Data Studio。
答案 1 :(得分:1)
虽然AngocA总的来说是正确的,但必须说你所经历的可能会暗示一些配置问题,因为在正常情况下,两个只读事务不应该相互锁定。
DB2 normaly使用行锁定。但是,如果锁定行的数量对于所谓的锁定列表而言太大,则db2服务器可能会执行所谓的“锁定升级”,并使用表上的单个独占锁替换某些表的数百万行锁。
这种行为还取决于所谓的隔离模式,但这是SO帖子中不易解释的主题;你需要阅读一些文档才能理解它。
可以使用db参数LOCKLIST配置锁定列表的大小。诊断日志(查找文件db2diag.log
)会告诉您是否已发生锁定升级。