【问题标题】:select from final table(update table) concurrent select i.e select from two threads从最终表中选择(更新表)并发选择,即从两个线程中选择
【发布时间】:2016-06-16 16:29:11
【问题描述】:

由于我的项目中发生了一个并发问题,该问题是由于 2 个线程同时进入一起进行选择,所以两者都收到相同的值,理想情况下不应该发生。 选择一个值后,它应该执行更新,然后第二个线程应该选择更新的值。 我正在使用 DB2 我想过使用这种使用方法

从最终表中选择数字(更新表名 set columnanme="" 哪里)

。 我的问题是,当另一个线程进入以选择值时,这种方法会锁定数据库,因为 select 中有更新吗?并解决我的并发问题。 或者 我正在浏览并找到另一种方法

update table (.....) select col from table where wait for 结果

这个选择会等到第一个线程完成选择吗?

【问题讨论】:

  • 根据我的理解,更新语句将锁定记录,直到执行 COMMIT。您的 SELECT 语句可能无法获得对记录的独占控制权,因此我猜是这个问题。您可以尝试使用您的 select WITH CS,我认为它应该等待
  • 我认为我们需要更多地了解您的应用程序在做什么。 @PK20 可能是正确的,提高隔离级别可能会解决这个问题(尽管您可能需要 RS,并且 both 语句必须在事务中运行)。但我的直觉是抽搐。那么,我们能否至少获得两个完整的陈述(必要时匿名)?
  • 你想让阅读线程做什么?堵塞?失败?读取之前的值?
  • 我使用的是 IBM DB2 9.7。
  • 我通过 WMB 使用这个 DB2(使用 ESQL)。这将连接到 DB2,该 DB2 有一个包含 seq_num 列的表和 2 个用于 where 条件的其他列。线程根据其他两列访问这个 seq_num,然后通过递增来更新 seq_num,以便每个访问线程都获得唯一的 seq_num。感谢您的解决方案。 @PK20 我将用 RS 实现,看看会发生什么。

标签: select concurrency db2


【解决方案1】:

您当然可以做一件事来避免在某个读取器更新之前多次读取相同的值:

  1. 在独占模式下锁定表表名;
  2. SELECT id, ... FROM tablename WHERE ...;
  3. 更新表名 SET id=newval WHERE ...;
  4. 提交;

这当然会阻塞 full 表,这可能不是你想要的!

替代方法(相对标准,但涉及更多的编程逻辑):

  1. SELECT id, ... FROM tablename WHERE ...
  2. 从最终表中选择计数 (1)(更新表名 SET id=newval WHERE ... AND id=newval);
  3. 当这个 count(1) 为零时(意思是:其他人同时更新了 它)从 1)重复

--
彼得·范罗斯,
ABIS培训与咨询, 比利时鲁汶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多