我们可以一起选择和更新数据库吗?

时间:2013-02-21 19:56:28

标签: java postgresql

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

问题: 有没有办法当我执行select语句时 - 那时我只能同时改变结果集中返回的行的状态。

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

3 个答案:

答案 0 :(得分:2)

您可以在事务中SELECT ... FOR UPDATE NOWAIT在更新之前要处理的行。如果有人正在更新选定的行或已经对其进行过SELECT ... FOR SHARE NOWAIT的人,则SELECT ... FOR SHARE NOWAIT将失败并显示错误。

详情here

答案 1 :(得分:2)

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

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

  2. 另一个是提高序列化水平。请查看this related answer并按照其中的链接进行操作。

    值得一提的是,最多REPEATABLE READ甚至SERIALIZABLE事务将需要在Application端进行更改,因为这些隔离级别假定将通过序列化回滚一些事务错误,这是正常和预期的行为。

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

  3. 请查看this article on depesz.com,它可以很好地概述相关领域的可能缺点。

答案 2 :(得分:1)

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

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

使用锁定将确保只有您可以访问表格/行,而其他人不会直到您完成。