Select 从最终表(更新表)中选择并发选择,即从两个线程中选择

Select 从最终表(更新表)中选择并发选择,即从两个线程中选择,select,concurrency,db2,Select,Concurrency,Db2,由于我的项目中有一个并发性问题,这是由于两个线程同时进入来执行一个select,这两个线程都接收到相同的值,这在理想情况下是不应该发生的。 选择一个值后,它应该执行更新,然后第二个线程应该选择更新的值。 Am使用DB2 我想过用这种方法来使用 从最终表格中选择编号(更新表格名称集ColumnName=“” (何处) 。 我的问题是,当另一个线程进来选择值时,这种方法是否会锁定db,因为这个值是select中的更新?并解决我的并发问题。 或 我浏览了一下,发现了另一种方法 更新表(…)从等待的表中

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

从最终表格中选择编号(更新表格名称集ColumnName=“” (何处)

。 我的问题是,当另一个线程进来选择值时,这种方法是否会锁定db,因为这个值是select中的更新?并解决我的并发问题。 或 我浏览了一下,发现了另一种方法

更新表(…)从等待的表中选择列 结果


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

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

  • 在独占模式下锁定表tablename
  • 选择id。。。从tablename WHERE
  • 更新tablename SET id=newval,其中
  • 承诺 这当然会阻塞整个表,这可能不是您想要的

    替代方法(相对标准,但编程逻辑更复杂):

  • 选择id。。。从tablename开始,其中
  • 从最终表格中选择计数(1)(更新表格名称集合id=newval 式中,…且id=newval)
  • 而此计数(1)为零(意味着:其他人同时更新 它)从1)开始重复
  • --彼得·范鲁斯,
    ABIS培训与咨询,
    比利时鲁汶。

    据我所知,update语句将锁定记录,直到执行提交。您的SELECT语句可能无法获得对记录的独占控制权,因此我猜这是一个问题。您可以尝试将select与CS一起使用,我认为应该等待,然后我认为我们需要更多地了解您的应用程序正在做什么@PK20可能是对的,提高隔离级别可能会解决这个问题(尽管您可能需要RS,并且两个语句都必须在事务中运行),但我的直觉是不稳定的。那么,我们至少可以得到两个完整的语句(如果必要的话匿名)?您希望阅读线程做什么?块失败?阅读前面的值?我正在使用IBMDB29.7。我正在通过WMB(使用ESQL)使用DB2。这连接到DB2,DB2有一个列为seq_num的表,以及在where条件下使用的其他两列。线程基于其他两列访问此seq_num,然后通过递增更新seq_num,以便每个访问线程获得唯一的seq_num。感谢您的解决方案@PK20我将用RS实现,看看会发生什么。