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

Java 我们可以一起选择和更新数据库吗?,java,postgresql,Java,Postgresql,我有一个逻辑,可以从数据库中选择一些状态为“就绪”的行 一旦得到结果集,我需要将状态更新为“processing”,这样其他线程就无法访问这些行。然后我必须对结果集中的记录执行一些逻辑,一旦处理完成,我需要再次将记录状态更新为completed 问题: 当我执行select语句时,有没有一种方法可以同时更改结果集中返回的行的状态 是否有人可以建议是否有一种在java中实现它的好方法。您可能正在寻找允许您自己锁定表/行的“锁”。PostgreSQL网站上有一个很好的例子: 使用锁将确保只有您有权

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

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


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

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


使用锁将确保只有您有权访问表/行,其他人只有在您完成后才能访问。

您可以
选择。。。对于事务中的UPDATE NOWAIT
,在更新行之前要处理的行<代码>选择。。。对于SHARE NOWAIT,如果有人正在更新所选行或有人已更新所选行,则AIT将失败并出错。
SELECT。。。用于在其上共享NOWAIT


详细信息。

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

  • 正如其他人提到的,这是你的选择之一

  • 另一个是提高序列化级别。请看一看,并遵循那里的链接

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

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

  • 请看一下,它很好地概述了相关领域可能存在的缺陷


  • 这将是一个数据库特性,而不是编程语言。尽管如此,您仍然可以在Java(或其他PL)中创建一个函数来处理
    UPDATE
    SELECT
    语句来解决您的问题。另一个解决方案可能是创建一个同时执行
    UPDATE
    SELECT
    语句的存储过程,然后使用Java中的
    CallableStatement
    执行该过程。我不确定您想要做什么,但PostgreSQL还具有
    SELECT FOR UPDATE
    功能,该功能将选择行并在其上创建访问锁:锁定整个表可能是个坏主意。在这种情况下,行级锁更好。