DB2 Read没有锁定?

时间:2014-06-08 18:03:36

标签: db2 deadlock isolation-level dirtyread

我们有一个正在修改记录的交易。事务必须调用Web服务,如果服务失败则回滚事务(因此它不能事先提交)。由于记录已修改,因此客户端应用程序已锁定该记录。但是,Web服务必须检索该记录以从其中获取信息作为其处理的一部分。巴姆,僵局。

我们使用websphere,由于我的想法,默认为可重复的读隔离级别。我们将其击倒为read_committed,认为这将在不寻求锁定的情况下检索行。在我们的开发环境中,它似乎有效,但在分阶段我们遇到了僵局。

我不是在问为什么表现不同,我们可能在某处犯了错误。我也没有询问上面的Web服务示例的具体细节,因为显然同样的事情可能发生在其他地方。

但基于阅读文档,似乎read_committed在读取期间获取共享锁,因此将等待另一个事务(在本例中为客户端应用程序)持有的独占锁。但是我不想去read_uncommitted隔离级别因为我不想要脏读。有一个不太极端的解决方案吗?我需要一些中间点,我可以在没有任何锁定等待的情况下执行读取,并且只检索已提交的数据。

有这样的金发女郎解决方案吗?不是太死了,不是太脏了读?如果不是在siolation级别,也许一些修饰符我可以添加到我的SQL?什么?

2 个答案:

答案 0 :(得分:1)

我假设您正在谈论jdbc隔离级别,而不是db2。 read_committed(db2中的游标稳定性)和repeatable_read(读稳定性)之间的区别在于共享锁的保留时间。 repeatable_read保持每个满足谓词的锁,另一方面read_committed只保留锁,直到找到与谓词匹配的另一行。

你有没有比较过计划?如果计划不同,您可能会遇到不同的行为。

是否有任何升级?

您是否尝试过CURRENTLY_COMMITTED(假设您使用的是9.7 +)?

Pre current_committed那里有以下设置,DB2_SKIPINSERTED,DB2_EVALUNCOMMITTED和DB2_SKIPDELETED

答案 1 :(得分:0)

读取提交的行的最低隔离级别是读取提交的。

通常,您处理DB2数据库中的行,如下所示:

  1. 读取没有读锁定的数据库行(普通SELECT读取已提交)。
  2. 处理数据,以便您拥有更改值的行。
  3. 使用读锁定再次读取数据库行。 (选择更新)
  4. 检查1中的数据库行是否与3中的数据库行匹配。
  5. 如果行匹配,请更新数据库行。
  6. 如果行不匹配,请释放更新锁定并返回2.