我们有一个正在修改记录的交易。事务必须调用Web服务,如果服务失败则回滚事务(因此它不能事先提交)。由于记录已修改,因此客户端应用程序已锁定该记录。但是,Web服务必须检索该记录以从其中获取信息作为其处理的一部分。巴姆,僵局。
我们使用websphere,由于我的想法,默认为可重复的读隔离级别。我们将其击倒为read_committed,认为这将在不寻求锁定的情况下检索行。在我们的开发环境中,它似乎有效,但在分阶段我们遇到了僵局。
我不是在问为什么表现不同,我们可能在某处犯了错误。我也没有询问上面的Web服务示例的具体细节,因为显然同样的事情可能发生在其他地方。
但基于阅读文档,似乎read_committed在读取期间获取共享锁,因此将等待另一个事务(在本例中为客户端应用程序)持有的独占锁。但是我不想去read_uncommitted隔离级别因为我不想要脏读。有一个不太极端的解决方案吗?我需要一些中间点,我可以在没有任何锁定等待的情况下执行读取,并且只检索已提交的数据。
有这样的金发女郎解决方案吗?不是太死了,不是太脏了读?如果不是在siolation级别,也许一些修饰符我可以添加到我的SQL?什么?
答案 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数据库中的行,如下所示: