【问题标题】:How to update exactly one record and select updated row in a single db2 query如何在单个 db2 查询中准确更新一条记录并选择更新的行
【发布时间】:2013-09-27 21:58:27
【问题描述】:

我想编写一个查询,它只更新表的一行,然后返回更新的行。

我可以使用

实现获取返回的行
select field from final table 
(update tablename set anotherfield = 'dd' where someanotherfield = 'bb')

一种说法。但我不能只更新一行。

另外,我调用这个查询的程序是一个多线程的,我不想死锁任何进程,所以我发现了 SKIP LOCKED DATA 语句,它类似于 t-sql 查询中的 readpast。

所以我想要做的是,我的程序使用一个像堆栈一样的 db2 表,每次只选择一行,更新它,这样任何其他线程都无法访问它,但不会让他们等待 整个表,他们只是跳过更新的行并从表中选择下一条记录。是否可以在单个 db2 查询中执行此操作?

这个查询我写到现在,无法处理

select COLUMN3 FROM FINAL TABLE
   ( 
      update MYTABLE 
      set    COLUMN1 = 'R'
      where  COLUMN1 = ''
          order by COLUMN2 
          FETCH FIRST 1 ROW ONLY 
          SKIP LOCKED DATA 
   )

任何帮助将不胜感激, 谢谢。

【问题讨论】:

  • #winces# SQL 定义sets 中工作得最好,这意味着它在尝试更新尽可能多的行时工作得最好.你想在这里完成什么?请注意,如果您正在尝试获取某种消息队列,那么数据库实际上将成为速度的瓶颈;你最好使用一个实际的“消息队列”类型的程序(其中许多还具有弹性特性,在多线程之上)....

标签: sql db2


【解决方案1】:

假设 COLUMN2 是一个 unique_id ,你可以这样做:

select COLUMN3 FROM FINAL TABLE
( 
    update MYTABLE 
    set    COLUMN1 = 'R'
    where  COLUMN1 = ''
        AND COLUMN2 = ( SELECT COLUMN2 
                        FROM MYTABLE 
                        ORDER by COLUMN2 
                        FETCH FIRST 1 ROW ONLY)
    SKIP LOCKED DATA 

)

您在更新中进行了订购,但这不起作用。您必须将其限制为只有一个结果(可能使用您的主键)。

【讨论】:

  • 但我不想更新每一行,正如标题所说的,我想逐行更新。
  • 确实如此。我看错了。我编辑了我的答案。
  • 好的,它有效。但我想问一个问题。它可以避免死锁吗?获取主键的内部子查询会进行已提交的读取,对吗?如果我在我的多线程程序中使用该查询,我认为每个线程都会等待另一个进程从表中获取主键元素。我对吗?你有什么看法?
  • 我不确定。我认为你应该为此写另一个问题。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多