【问题标题】:Select column and hide from other selects选择列并隐藏其他选择
【发布时间】:2014-11-05 07:10:12
【问题描述】:

我正在处理一种在 oracle 11.2 表中实现的消息队列。我知道,错了,我还有。

表格由idmessagedatestatus组成。所有新消息都以 NEW 状态插入。我正在开发 java (jdbc) 阅读器,它选择最旧的新消息:

select * from messages
where status = NEW and rownum <= 1
order by date asc

阅读器处理消息并将其状态设置为 DONE。它运作良好,而我们只有一个读者。多个阅读器的问题是,他们都选择了相同的消息。

我正在尝试通过将状态更新为 WORKING 来解决此问题。下面的伪代码正确吗?

//autocommit is on
id = query(select … for update)
query(update messsages set status = WORKING where id = :id)
…do some processing in reader…
query(update messsages set status = DONE where id = :id)

它适用于多个并发阅读器吗?读者会在大部分时间里等待锁吗?或者他们只会得到下一个未锁定的行?

【问题讨论】:

    标签: java sql database jdbc oracle11g


    【解决方案1】:

    除非您在select for update 中包含skip locked 子句,否则多个读者将等待。 From the documentation:

    默认情况下,SELECT FOR UPDATE 语句会一直等待,直到获得请求的行锁。要更改此行为,请使用SELECT FOR UPDATE 语句的NOWAITWAITSKIP LOCKED 子句。

    And:

    SKIP LOCKED 是处理锁定某些感兴趣行的竞争事务的另一种方法。指定SKIP LOCKED 指示数据库尝试锁定由WHERE 子句指定的行,并跳过发现已被另一个事务锁定的任何行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 2014-09-15
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      相关资源
      最近更新 更多