5

我有逻辑从数据库中选择一些状态为“就绪”的行,一旦我得到结果集,我需要将状态更新为“处理”,因此没有其他线程可以访问这些行。然后我必须对结果集中的记录执行一些逻辑,并且处理完成我需要再次将记录状态更新为已完成。

问题:当我执行 select 语句时,有没有一种方法 - 那时只有我可以同时更改结果集中返回的行的状态。

有人可以建议是否有在java中实现它的好方法。

4

3 回答 3

2

您可以SELECT ... FOR UPDATE NOWAIT在事务中更新要处理的行,然后再更新它们。SELECT ... FOR SHARE NOWAIT如果有人正在更新选定的行或有人已经SELECT ... FOR SHARE NOWAIT对其进行了更新,则会失败并出现错误。

详情here

于 2013-02-21T20:17:55.807 回答
2

回答你的主要问题:是的,你可以做到!

  1. 正如其他人所提到的,SELECT … FOR UPDATE这是您的选择之一。

  2. 另一个是增加序列化级别。请看一下这个相关的答案并点击那里的链接。

    值得一提的是,达到REPEATABLE READ甚至是SERIALIZABLE事务都需要在应用程序端进行更改,因为这些隔离级别假定一定数量的事务将因序列化错误而回滚,这是正常且预期的行为。

    此外,更严格的隔离级别(以及更多SELECT … FOR UPDATE查询)将导致性能下降,并可能导致竞争条件,具体取决于设计。

  3. 请查看depesz.com 上的这篇文章,它很好地概述了相关领域可能存在的缺陷。

于 2013-02-21T20:48:15.127 回答
1

您可能正在寻找允许您锁定表/行(为自己)的“锁”。可以在 PostgreSQL 网站上找到一个很好的示例:

http://www.postgresql.org/docs/current/static/sql-lock.html

使用锁将确保只有您可以访问表/行,而其他人在您完成之前无法访问。

于 2013-02-21T20:02:29.317 回答