2013-02-28 83 views
0

我们拥有一个包含四个克隆的WebSphere集群。相同的代码在每个克隆上运行。我们Quartz定期启动一个运行代码的工作。DB2锁定超时

代码尝试更新表中的一行,以便只有一个克隆能够成功更新表,然后该克隆将运行剩余的工作。例如:

update <table> set status = 'RUNNING' where job_name = 'JOB1' and status = 'STOPPED' 

当我们执行更新语句时,我们不启动事务。

我们有时看到的是,所有四个克隆都无法更新表,并且全部都获得锁超时错误(sql代码-913)。我们还尝试了一个替代方案,我们开始一个事务,选择查看该行是否标记为正在运行,如果没有,则执行更新和提交;否则回滚。

这有同样的问题。

我们还没有尝试的一个解决方案是将select修改为“select for update”,虽然从我的googleing中,我怀疑这是否会有所帮助。

有什么建议吗?

+0

什么版本的DB2?什么是完整的错误信息?你确定没有别的东西在触摸那张桌子,并且没有触发器(或类似的)?语句的运行频率如何 - 是否有可能以前的事务仍在运行?像这样运行'UPDATE'可能是你最好的选择。 – 2013-03-01 18:22:38

回答

0

这最终没有成为一个问题(这是我得到的聆听某人没有自己检查出来)。

我在我们的开发环境中测试了两个克隆。其中一个克隆偶尔会看到-913锁定超时错误,而另一个克隆会成功更新该表。除了丑陋的日志消息之外,所有事情都应该如此。

但是,通常情况下,我们不会得到-913错误,而是一个警告,指示没有行要从其中一个克隆进行更新。再次,这种行为是好的。

因此,正如我们原先所想的那样,Clockwork-Muse也建议,以这种方式使用UPDATE语句来强制锁定在DB2中工作得很好。